通过Rails中的两个关联构建对象

时间:2012-10-17 16:34:58

标签: ruby-on-rails ruby associations

是否可以通过两个has_many关联构建对象?例如:

# posts_controller.rb
def create
  @post = current_account.posts.build(params[:post])
  @post.author = current_user # I want to compact this line into the previous one
end

我做了一些研究并发现了这个:

@article = current_account.posts.build(params[:post], user_id: current_user.id)

然而,这不起作用。在控制台中,每当我构建一个新对象时,我都会得到user_id: nil

我无法实现的另一个潜在解决方案:

@post = current_account.post_with_user(current_user).build(params[:post])

但是我编写的post_with_user的每个实现都失败了。

我的协会如下:

class Discussion < ActiveRecord::Base
  belongs_to :account
  belongs_to :author, class_name: 'User', foreign_key: 'user_id', inverse_of: :discussions
end

class User < ActiveRecord::Base
  belongs_to :account
  has_many :discussions, inverse_of: :author
end

class Account < ActiveRecord::Base
  has_many :users, inverse_of: :account
  has_many :discussions
end

2 个答案:

答案 0 :(得分:1)

您的代码显示您尝试执行的操作,您应该可以执行此操作。看起来应该是这样的:

@article = current_account.posts.build(params[:post])

由于您正在建立当前帐户帖子的列表,因此您无需传递当前帐户的ID。 (我不确定你的current_user是否与你的current_account相同,你可能希望澄清一下)。

要将帖子创建压缩为一行,您可以执行以下两项操作之一。

  1. 将用户/作者与帖子之间的关系转换为双向关系。查看订单属于客户的文档http://guides.rubyonrails.org/association_basics.html和客户has_many订单。您可以自定义关系的名称,以便帖子具有“作者”而不是用户,通过将其称为“作者”,然后使用我认为将取值的class_name参数:user。

  2. 在Post类中添加after-create挂钩,并将author值设置为与当前用户相同。在不了解您的用户子系统的情况下,我无法填写更多有关此内容的详细信息。

答案 1 :(得分:1)

params变量只是一个哈希值,因此这些行中的某些内容应该可以为您提供一个内容:

@post = current_account.posts.build params[:post].merge({ :user_id => current_user.id })