如何创建属于两个模型的对象

时间:2013-09-24 05:12:04

标签: ruby-on-rails associations

有没有办法可以创建属于其他两个模型的模型的对象,例如,如果我有许多帖子的用户,然后帖子可以有很多评论和评论属于用户和帖子。如果我做post.comments.create()它只关联post与评论,如果我做user.comments.create()然后它将关联用户。如果我想将两者都与评论相关联,那么方法是什么。我知道我可以使用多态关联但是还有其他方法吗?

3 个答案:

答案 0 :(得分:3)

首先,当您谈论关联时,您必须记住我们build而不是create。一个非常简单的方法来做你需要的是

    class Comment < ActiveRecord::Base
      belongs_to :user
   end

并且不要忘记在User中添加关系的另一面:

 class User < ActiveRecord::Base
  has_many :comments
 end

现在,我知道你必须在评论表中创建一个字段user_id。如果没有,则需要通过此迁移添加它。

rails g migration add_user_id_to_comments user_id:string

现在执行rake db:migrate

或者更好的方法。

在创建模型注释时,您可以添加用户:迁移行中的引用,如此

rails g model Comment text:string post:references user:references

以这种方式,关系的一侧将自动添加到模型中,user_id和post_id字段也将自动添加到您的注释表中。

回到你的问题。 如果您没有找到其他类似的方式,请在隐藏字段中传递用户ID:

<%= hidden_field_tag "userid", current_user.id%>

我希望你有当前的用户定义。 现在你可以在像这样的评论的控制器中接受这个

If params[:userid]
 user_id = params[:userid]
end

您可以在注释控制器的创建操作中的保存功能之前包含它。

希望这有帮助

干杯!

答案 1 :(得分:2)

您可以对两个模型使用belongs_to。唯一的区别是,在创建评论时,您必须明确提及您未创建的模型的ID。我举一个例子:

class Comment
  belongs_to :user
  belongs_to :post
end

comment = post.comments.create(user_id: some_user_id)

由于我通过帖子评论关系创建了评论,因此帖子ID会自动插入到评论的post_id属性中。我特别提到user_id,以便comment.user将返回ID为some_user_id的用户。

修改

创建注释时,要使用params哈希中的注释属性,请使用以下命令:

comment = post.comments.build(params[:comment])
comment.user_id = some_user_id
comment.save

答案 2 :(得分:0)

创建像这样的评论可能更直观:

comment = Comment.create(user_id:user-you-want-to-associate.id,post_id:post-you-want-to-associate.id)