2012-02-19 62 views
8

我有三个模型,全部用于has_many:through关系。他们看起来像这样:使用has_many:通过并构建

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记录生成,但在CompanyUser记录company_id字段设置为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

我敢肯定,我在这里做一些愚蠢的事情,我只是不知道是什么。

回答

14

您不能使用的has_many:通过这样,你必须做这样的:

@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 } 
     ] 
    } 
} 

而且你会被添加用户自动为您的公司。

+0

所以,如果你想允许某人编辑公司,让他们增加与用户的复选框我需要的user_ids阵列拉出params哈希表,并创建一个CompanyUser纪录为每一个? – 2012-02-19 04:29:52

+0

补充上面的答案。 – 2012-02-19 04:54:01

+0

谢谢!那是我错过的。我甚至没有考虑过制作那样的表格。称我为愚蠢。 – 2012-02-19 05:01:55

4

我怀疑你的params[:user]参数,否则你的代码看起来很干净。 We can use build method with 1..n and n..n associations too,参见here

我建议你首先要确保你的模型协会工作正常,为打开console和尝试以下方法,

> company = Company.last 
=> #<Tcompany id: 1....> 
> company.users 
=> [] 
> company.users.build(:name => "Jake") 
=> > #<User id: nil, name: "Jake"> 
> company.save 
=> true 

现在,如果记录被保存的很好,调试你传递给参数构建方法。

快乐调试:)