单个模型的两个关联

时间:2017-12-12 19:50:38

标签: ruby-on-rails

在我的项目中有一个用户模型和帖子模型。在该帖子属于用户(对于帖子的作者)和has_and_belongs_to_many:帖子(对于已读和未读状态)。

如何使用current_user创建新帖子。我是否需要合并参数中的current_user值。如果我使用@ user.posts.new(params)查找连接表。还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

在rails关联中,不需要将其命名为与模型相同的名称。它只是一种惯例,可以在没有任何配置的情况下创建关联。

创建别名关联非常简单:

class Post < ApplicationRecord
  belongs_to :author, class_name: 'User'
end

class User < ApplicationRecord
  has_many :posts, foreign_key: 'author_id'
end

您甚至可以使用此技术与同一个表建立多个关联:

class Post < ApplicationRecord
  belongs_to :author, class_name: 'User'
  belongs_to :editor, class_name: 'User'
end

要跟踪哪些用户访问了哪些页面,但您需要一个连接表,因为这是一个多对多关联:

class Post < ApplicationRecord
  has_many :visits
  has_many :visitors, through: :visits
                      source: :user
end

class Visit < ApplicationRecord
  belongs_to :user
  belongs_to :post
end

class User < ApplicationRecord
  has_many :visits
  has_many :visited_pages, through: :visits
                      source: :page
end
  

如何使用current_user创建新帖子?

您可以这样做:

@post = current_user.posts.new(posts_params)

或者:

@post = Posts.new(posts_params) do |p|
  p.user = current_user
end

如果您需要将用户的参数与其他值组合在一起,然后使用params哈希进行整理,那么使用类似于后面的块是一种更清晰的技术。