0

是否可以通过两个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
4

2 回答 2

1

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

@post = current_account.posts.build params[:post].merge({ :user_id => current_user.id })
于 2012-10-17T20:52:46.813 回答
1

您的代码显示您尝试做的事情,您应该能够做到。它应该看起来像这样:

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

因为您正在构建当前帐户的帖子列表,所以您不必传递当前帐户的 ID。(我不确定您的 current_user 是否与您的 current_account 相同,您不妨澄清一下)。

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

  1. 将用户/作者与帖子之间的关系转变为双向关系。查看文档http://guides.rubyonrails.org/association_basics.html订单属于_to a customer, and a customer has_many orders。您可以自定义关系的名称,以便帖子具有“作者”而不是用户,方法是将其称为“作者”,但随后使用我假设将采用值的 class_name 参数:用户。

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

于 2012-10-17T16:49:42.690 回答