5

यह वास्तव में मुझे नीचे ला रहा है! :(रेल पॉलीमोर्फिक चेकबॉक्स के माध्यम से कई हैं

मैं इसमें एक चेकबॉक्स सूची जहां कई स्टोर या जाँच की जा सकती अनियंत्रित मॉडल स्टाफिंग के माध्यम से स्टोर प्रशासन के लिए के साथ अपने उपयोगकर्ता मॉडल के लिए एक नेस्टेड मॉडल प्रपत्र बनाने के लिए कोशिश कर रहा हूँ

class Staffing < ActiveRecord::Base 
    # Associations 
    belongs_to :user 
    belongs_to :staffable, :polymorphic => true 
    belongs_to :store,  :class_name => "Store", 
         :foreign_key => "staffable_id" 
end 

class User < ActiveRecord::Base 
    # Includes 
    acts_as_authentic 

    # Associations 
    has_many :staffings, :dependent => :destroy 
    has_many :stores, :through => :staffings 

    # Nested Attributes 
    accepts_nested_attributes_for :staffings, :allow_destroy => true 
end 

class Store < ActiveRecord::Base 
    # Associations 
    has_many :staffings, :as => :staffable, :dependent => :destroy 
    has_many :users, :through => :staffings 
end 


# Users Controller 
def create 
    @user = User.new(params[:user]) 
    flash.now[:notice] = "#{@user.name} was successfully created." if @user.save 
    respond_with @user 
end 


def update 
    @user = User.find(params[:id]) 
    params[:user][:store_ids] ||= [] 
    @user.update_attributes(params[:user]) 
    flash.now[:notice] = "#{@user.name} was successfully updated." 
    respond_with @user 
end 

के लिए हाथ में प्रयोजनों के अन्य staffable संघ पर ध्यान नहीं दिया जा सकता है। यह एक ऐसी ही मॉडल है कि मैं अंत में स्टोर लेकिन पहली बात के साथ-साथ प्रशासन के लिए पहले के बाद से मैं बहुत स्टम्प्ड रहा हूँ के रूप में यह है चाहेंगे है।

# User Form 
- for store in Store.all 
    %p 
    = check_box_tag "user[store_ids][]", store.id, @user.stores.include?(store) 
    = store.nickname 

मेरी पैरामीटर भेजता है इस प्रकार के साथ:

{"utf8"=>"✓", 
"authenticity_token"=>"blub-blub-blub=", 
"user"=>{"login"=>"hey.buddy", 
"email"=>"[email protected]", 
"role"=>"admin", 
"hq"=>"1", 
"password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]", 
"store_ids"=>["3", 
"4"]}} 

और फिर त्रुटि!

Mysql2::Error: Column 'staffable_type' cannot be null: INSERT INTO `staffings` (`created_at`, `staffable_id`, `staffable_type`, `updated_at`, `user_id`) VALUES ('2010-11-17 00:30:24', 3, NULL, '2010-11-17 00:30:24', 102) 

मैं जानता हूँ कि मैं 'स्टोर' के रूप में staffable_type बाहर का निर्माण करने के लिए है, लेकिन मैं पूरे दिन की कोशिश कर रहा है - चाल क्या है?

मेरे पास staffable_type (और id) कॉलम सेट हैं: null => false लेकिन यह इसका कारण नहीं हो सकता क्योंकि इसे डीबी को मारने से पहले नियंत्रक में सीधे बाहर करने की आवश्यकता है।

क्यों नीचे मेरी बनाने कार्रवाई में काम नहीं करता है:

@user.staffings.each do |s| 
    s.staffable_type = 'Store' 
end 

या:

@user.store_ids.each do |i| 
    s = @user.staffings.build 
    s.staffable_type = 'Store' 
    s.staffable_id = i 
end 

तो कई कोई लाभ नहीं हुआ ऊपर करने के लिए इसी तरह की बातों की कोशिश कर रहा। किसी भी मदद की सराहना की जाएगी।

आपके समय के लिए धन्यवाद!

उत्तर

4

ठीक है, मैंने इसे एक बाहर निकाला। मैं यहां जवाब दे रहा हूं इसलिए मैं उम्मीद कर सकता हूं कि किसी दिन किसी की मदद करें, लेकिन कई लोगों के बीच कई लोगों के बीच अंतर और समस्या के बीच की समस्या पर एक बुनियादी निगरानी थी।

यदि आप हैस कई में चेकबॉक्स या बहुविकल्पीय सूचियों को संभालना चाहते हैं, तो एसोसिएशन द्वारा आपके लिए उत्पन्न कोई '_ids' विधि नहीं है और आपको अपने लिए एक लिखना होगा।

देखें पॉल बैरी यहाँ लेख: http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes

बहुरूपी सामान जटिल हो सकता है, लेकिन यदि आप अटक असली अच्छा कर रहे हैं शायद एक कदम पीछे जाएं और यकीन है कि यह कुछ और भी अधिक बुनियादी है कि नहीं है कि आप up-- खिलवाड़ है मेरे लिए काम किया!

नीचे कोड है कि यह कैसे संभाल करने के लिए यदि आप एक बहुरूपी साथ काम कर रहे पर पॉल के ब्लॉग से संशोधित के माध्यम से कई (मूल रूप से आप सिर्फ गुण हैश का उपयोग करें और अपने polymorphic_type विशेषता लिखने की ज़रूरत) है:

attr_accessor :store_ids 
after_save :update_stores 

#after_save callback to handle group_ids 
def update_stores 
    unless store_ids.nil? 
    self.staffings.each do |staffing| 
     staffing.destroy unless store_ids.include?(staffing.staffable_id.to_s) 
     store_ids.delete(staffing.staffable_id.to_s) 
    end 
    store_ids.each do |s| 
     self.staffings.create(attributes = {:staffable_id => s, :staffable_type => 'Store'}) unless s.blank? 
    end 
    reload 
    self.store_ids = nil 
    end 
end 
संबंधित मुद्दे