2013-10-19 6 views
8

के माध्यम से कई मैं एक मेरे एप्लिकेशन में संबंध के माध्यम से कई है है है:find_or_create संबंध

शो कई बैंड =>लाइनअप

बैंड के माध्यम से द्वारा अद्वितीय हैं हैं: नाम

class Show < ActiveRecord::Base 
attr_accessible :city_id, :title, :dateonly, :timeonly, :image, :canceled, :venue_attributes, :bands_attributes 

    belongs_to :city 
    belongs_to :venue 
    has_many :lineups 
    has_many :bands, through: :lineups 
    has_and_belongs_to_many :users 
end 


class Lineup < ActiveRecord::Base 
    belongs_to :show 
    belongs_to :band 


end 


class Band < ActiveRecord::Base 
    attr_accessible :name, :website, :country, :state 
    has_many :lineups 
    has_many :shows, through: :lineups 

    validates :name, presence: true 
    validates_uniqueness_of :name 
    before_save :titleize_name 

    private 
    def titleize_name 
     self.name = self.name.titleize 
    end 

end 

नए बैंड इस तरह बनाए गए हैं:

(मान लीजिए कि हम एक शो रिकॉर्ड पहले से ही एस 1 कहा जाता बचाया है)

> s1.bands.new(name: "Wet Food") 
> s1.save 

अभी यह केवल पहले से ही मौजूद

जो मॉडल में बचत होगी अगर एक बैंड "गीले खाद्य" का नाम नहीं है इस संबंध में Band.find_or_create करने के लिए सबसे अच्छी जगह है ताकि एक मौजूदा बैंड का उपयोग किया जा सके यदि एक ही नाम वाला कोई मौजूद है?

+0

जहां Band.find_or_create का उपयोग करके एक मौजूदा बैंड का प्रयोग करेंगे? और Band.where (नाम: 'गीले भोजन') का उपयोग करने का प्रयास करें। Band.find_or_create के बजाय first_or_create। – Kuldeep

+0

लाइनअप में बैंड_आईडी है इसलिए मुझे लगता है? – wiredin

+0

तो लाइनअप एक प्रदर्शन के समान है, एक बैंड प्रति शो एक करता है। एक शो में प्रति शो में कई प्रदर्शन होते हैं। –

उत्तर

15

यह आम तौर पर कॉल का प्रकार है जो Controller (या शायद एक सेवा ऑब्जेक्ट) में जाएगा, लेकिन Model में नहीं। यह वास्तव में उस विशेष उपयोगकर्ता प्रवाह पर निर्भर करता है जिसे आप अपने ऐप में पूरा करने का प्रयास कर रहे हैं। असल में, जहां कभी आप पहले से ही s1.bands.new उपयोग कर रहे हैं, तो आप इस के बजाय इस्तेमाल कर सकते हैं:

s1.bands.where(name: 'Wet Food').first_or_create 
संबंधित मुद्दे