2012-02-19 20 views
8

के माध्यम से मेरे पास तीन मॉडल हैं, सब कुछ है I_any: रिश्ते के माध्यम से। वे इस तरह दिखते हैं:है hasmmany का उपयोग करके:

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 सरणी खींच सकते हैं और एक CompanyUser रिकॉर्ड बनाने के लिए की आवश्यकता होगी उन्हें चेक बॉक्स के साथ उपयोगकर्ताओं को जोड़ने के लिए अनुमति देने के लिए अनुमति देने के लिए करना चाहता था प्रत्येक के लिए? –

+0

उपरोक्त पूरक उत्तर। –

+0

धन्यवाद! यही वह था जो मैं याद कर रहा था। मैंने इस तरह के फॉर्म बनाने के बारे में भी सोचा नहीं था। मुझे बेवकूफ होने पर बुलाया। –

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 

अब रिकॉर्ड ठीक सहेजा जा रहा है कर रहे हैं, डिबग मानकों आप को पारित निर्माण विधि।

मुबारक डिबगिंग :)

तो
संबंधित मुद्दे