是否可以通过两个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
答案 0 :(得分:1)
您的代码显示您尝试执行的操作,您应该可以执行此操作。看起来应该是这样的:
@article = current_account.posts.build(params[:post])
由于您正在建立当前帐户帖子的列表,因此您无需传递当前帐户的ID。 (我不确定你的current_user是否与你的current_account相同,你可能希望澄清一下)。
要将帖子创建压缩为一行,您可以执行以下两项操作之一。
将用户/作者与帖子之间的关系转换为双向关系。查看订单属于客户的文档http://guides.rubyonrails.org/association_basics.html和客户has_many订单。您可以自定义关系的名称,以便帖子具有“作者”而不是用户,通过将其称为“作者”,然后使用我认为将取值的class_name参数:user。
在Post类中添加after-create挂钩,并将author值设置为与当前用户相同。在不了解您的用户子系统的情况下,我无法填写更多有关此内容的详细信息。
答案 1 :(得分:1)
params
变量只是一个哈希值,因此这些行中的某些内容应该可以为您提供一个内容:
@post = current_account.posts.build params[:post].merge({ :user_id => current_user.id })