2012-02-19 41 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 

現在,如果記錄被保存的很好,調試你傳遞給參數構建方法。

快樂調試:)