2013-10-19 9 views
8

ho una ha molti attraverso la relazione nella mia app:find_or_create su una ha molti attraverso la relazione

Spettacoli ha molte Band attraverso => ​​Formazioni

Band sono uniche da: Nomi della

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 

nuove band sono creati in questo modo:

(diciamo che abbiamo un record di spettacolo già salvato chiamato S1)

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

In questo momento questo salverà solo se una band di nome "Wet Food" non esiste già

In quale modello è il posto migliore per fare un Band.find_or_create in questa relazione in modo che una banda esistente possa essere usata se esiste una con lo stesso nome?

+0

dove userete una fascia esistente utilizzando Band.find_or_create? e prova ad usare Band.where (nome: 'Wet Food'). first_or_create invece di Band.find_or_create. – Kuldeep

+0

lineup contiene il band_id è così credo che ci sia? – wiredin

+0

quindi la scaletta è simile a una performance, una band ne fa una per spettacolo. uno spettacolo ha più spettacoli per spettacolo. –

risposta

15

Questo è generalmente il tipo di chiamata che andrebbe in un Controller (o forse un oggetto di servizio), ma non in un Model. Dipende davvero dal particolare flusso utente che stai cercando di realizzare nella tua app. In sostanza, dove mai si sta già utilizzando s1.bands.new, è possibile utilizzare questo invece:

s1.bands.where(name: 'Wet Food').first_or_create 
Problemi correlati