在ActiveRecord中,我们可以使用has_many
和belongs_to
关联方法来实现外键关系。下面是一个示例:
首先,假设我们有两个模型,一个是User
,另一个是Post
。每个用户可以拥有多个帖子,每个帖子只属于一个用户。
# user.rb
class User < ApplicationRecord
has_many :posts
end
# post.rb
class Post < ApplicationRecord
belongs_to :user
end
在上面的代码中,has_many
和belongs_to
方法指定了模型之间的关系。在User
模型中,has_many :posts
表示一个用户可以拥有多个帖子。在Post
模型中,belongs_to :user
表示一个帖子只属于一个用户。
接下来,我们需要为posts
表添加一个外键列,以便在数据库中维护关联关系。我们可以使用Rails的数据库迁移来实现这个步骤。
# db/migrate/create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.1]
def change
create_table :posts do |t|
t.string :title
t.text :content
t.references :user, foreign_key: true
t.timestamps
end
end
end
在上面的代码中,t.references :user, foreign_key: true
创建了一个名为user_id
的外键列,并通过foreign_key: true
选项告诉数据库维护外键关系。
最后,我们可以在控制器中使用这个外键关系。例如,我们可以创建一个新的帖子并将其关联到一个用户:
# posts_controller.rb
class PostsController < ApplicationController
def create
@user = User.find(params[:user_id])
@post = @user.posts.build(post_params)
if @post.save
# 保存成功的逻辑
else
# 保存失败的逻辑
end
end
private
def post_params
params.require(:post).permit(:title, :content)
end
end
在上面的代码中,我们首先找到了用户对象@user
,然后使用@user.posts.build(post_params)
创建了一个与该用户关联的新帖子@post
。最后,我们可以通过调用@post.save
来保存帖子。
这样,我们就成功地使用has_many
和belongs_to
实现了外键关系,并在控制器中实现了相关逻辑。