我有三个模型,都用于 has_many :through 关系。它们看起来像这样:
class Company < ActiveRecord::Base
has_many :company_users, dependent: :destroy
has_many :users, through: :company_users
accepts_nested_attributes_for :company_users, :users
end
class CompanyUser < ActiveRecord::Base
self.table_name = :companies_users #this is because this was originally a habtm relationship
belongs_to :company
belongs_to :user
end
class User < ActiveRecord::Base
# this is a devise model, if that matters
has_many :company_users, dependent: :destroy
has_many :companies, through: :company_users
accepts_nested_attributes_for :company_users, :companies
end
这加载很好,并且连接是为查询而构建的。但是,每当我做类似的事情时
@company = Company.last
@user = @company.users.build(params[:user])
@user.save #=> true
@company.save #=> true
User
记录和 CompanyUser
记录被创建,但是 company_id
CompanyUser
中的字段记录设置为 NULL
INSERT INTO `companies_users` (`company_id`, `created_at`,`updated_at`, `user_id`)
VALUES (NULL, '2012-02-19 02:09:04', '2012-02-19 02:09:04', 18)
当你 @company.users << @user
时它做同样的事情
我确定我在这里做了一些愚蠢的事情,我只是不知道是什么。
最佳答案
你不能像那样使用has_many :through,你必须这样做:
@company = Company.last
@user = User.create( params[:user] )
@company.company_users.create( :user_id => @user.id )
然后您将正确定义关联。
更新
在下面的评论中,因为您已经有了 accepts_nested_attributes_for,所以您的参数必须像这样:
{ :company =>
{ :company_users_attributes =>
[
{ :company_id => 1, :user_id => 1 } ,
{ :company_id => 1, :user_id => 2 },
{ :company_id => 1, :user_id => 3 }
]
}
}
并且您会自动为您将用户添加到公司。
关于ruby-on-rails - 使用 has_many :through and build,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9346261/