我正在尝试创建一个类似博客的应用,包含3个模型:用户,帖子和评论。正如所料,评论同时属于用户和帖子。
我使用了以下关联:
User.rb
has_many :comments
has_many :posts
Post.rb
has_many :comments
belongs_to :user
Comment.rb
belongs_to :user
belongs_to :post
我尝试使用以下方法创建评论: @ user.comments.create
但是,这会将评论与用户相关联,但不会与帖子相关。我希望评论与用户和帖子相关联。有办法吗?或者我使用了错误的关联?
我认为手动设置user_id或post_id可能是一种不好的做法,因此两个ID都不在attr_accessible中。我不确定它是否正确。
谢谢!
答案 0 :(得分:3)
具体而言,您无需设置post_id
。试试@user.comments.create(:post => @post)
。
答案 1 :(得分:0)
如果评论需要与多个模型相关联,我们称之为polymorphic association
。您可以查看has_many_polymorphs
插件。我认为你使用的是rails 3,你可以尝试以下方法:
您可以在lib/commentable.rb
文件夹中定义模块,如下所示:
module Commentable
def self.included(base)
base.class_eval do
has_many :comments, :as => commentable
end
end
end
在评论模型中,你应该说它是多态的:
belongs_to :commentable, :polymorphic => true
在Post和User模型中,您可以添加以下内容:
has_many :comments, :as => :commentable, :dependent => :delete_all
因为在Rails 3中,默认情况下不会加载lib文件夹,所以应该让Rails在你的application.rb中加载它:
config.autoload_paths += %W(#{config.root}/lib)
现在,Comment是多态的,任何其他模型都可以与之关联。这应该做。