【问题标题】:How to create an object that belongs to two modelsRails:如何创建属于两个模型的对象
【发布时间】:2013-09-29 04:24:26
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails associations


【解决方案1】:

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

class Comment
  belongs_to :user
  belongs_to :post
end

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

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

编辑

创建评论时,要使用 params 哈希中的 cmets 属性,请使用以下内容:

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

【讨论】:

  • 我知道我可以做到,但是如果评论属性来自表单呢?
  • 我认为最好在表单中使用 hidden_​​field_tag 并在那里指定 user_id 而不是这样做..但感谢您的帮助:)
【解决方案2】:

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

    class Comment < ActiveRecord::Base
      belongs_to :user
   end

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

 class User < ActiveRecord::Base
  has_many :comments
 end

现在,我了解到您必须在 cmets 表中创建了一个字段 user_id。如果没有,则需要通过本次迁移添加。

rails g migration add_user_id_to_comments user_id:string

现在做一个rake db:migrate

另外一种更好的方法是。

在创建模型 cmets 时,您可以像这样在迁移行中添加 users:references

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

这样,关系的一侧将自动添加到模型中,并且 user_id 和 post_id 字段将自动添加到您的 cmets 表中。

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

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

我希望您已经定义了当前用户。 现在你可以像这样在 cmets 的控制器中接受它了

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

您可以在 cmets 控制器的创建操作中将其包含在保存功能之前。

希望对你有帮助

干杯!

【讨论】:

  • 啊哈我知道除了 hidden_​​field_tag 之外的大部分内容,我认为这就是要走的路......谢谢
【解决方案3】:

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

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

【讨论】:

  • 这太冗长了:)..我认为更多的 Rails 方法是设置适当的嵌套路由,然后从 params 哈希中传入 post_id,例如: current_user.cmets.create(post_id: post_id_associated_coming_from_params)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2016-05-11
相关资源
最近更新 更多