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 

新しいバンドは次のように作成されます。

は「ウェットフード」という名前のバンドはすでにどのモデルで

存在しない場合にのみ保存されます今

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

(私たちはショーのレコードがすでにS1と呼ばれる保存されていると言うことができます)この関係でBand.find_or_createを実行して、同じ名前のバンドが存在する場合は既存のバンドを使用するのに最適な場所です。

+0

ここで、Band.find_or_createを使用して既存の帯域を使用しますか? Band.where(名前: 'Wet Food')を使用しようとすると、Band.find_or_createではなくfirst_or_createが使用されます。 – Kuldeep

+0

のラインアップにはband_idが含まれていますので、私はそこにいると思いますか? – wiredin

+0

ラインナップはパフォーマンスに似ていますが、バンドはショーごとに1つです。ショーごとに複数の公演があります。 –

答えて

15

これは一般的に、Controller(またはサービスオブジェクト)に入るコールタイプですが、Modelでは発生しません。それは実際にあなたのアプリで達成しようとしている特定のユーザーの流れに依存します。基本的にs1.bands.newを既に使用している場合は、代わりに次のように使用できます。

s1.bands.where(name: 'Wet Food').first_or_create 
関連する問題