2013-10-19 15 views
8

Tôi có một có rất nhiều thông qua mối quan hệ trong ứng dụng của tôi:find_or_create trên có rất nhiều thông qua mối quan hệ

Hiển có nhiều Bands qua =>Đội hình ra sân

Bands là duy nhất bởi: name

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 

Ban nhạc mới được tạo như thế này:

(cho phép nói chúng tôi có một kỷ lục chương trình đã được lưu gọi là s1)

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

Ngay bây giờ điều này sẽ chỉ tiết kiệm nếu một ban nhạc có tên là "Wet Thực phẩm" không tồn tại

Trong đó mô hình là nơi tốt nhất để làm một Band.find_or_create trong mối quan hệ này để một ban nhạc hiện có có thể được sử dụng nếu một người có cùng tên tồn tại?

+0

bạn sẽ sử dụng ban nhạc hiện tại bằng cách sử dụng Band.find_or_create? và cố gắng sử dụng Band.where (tên: 'Wet Food'). first_or_create thay vì Band.find_or_create. – Kuldeep

+0

đội hình chứa band_id vì vậy tôi đoán ở đó? – wiredin

+0

vì vậy dòng sản phẩm giống như hiệu suất, một ban nhạc thực hiện một lần cho mỗi chương trình. một chương trình có nhiều buổi biểu diễn cho mỗi chương trình. –

Trả lời

15

Đây thường là loại cuộc gọi sẽ đi theo số Controller (hoặc có thể là đối tượng dịch vụ), nhưng không phải trong số Model. Nó thực sự phụ thuộc vào luồng người dùng cụ thể mà bạn đang cố gắng thực hiện trong ứng dụng của mình. Về cơ bản, khi bạn đã sử dụng s1.bands.new, bạn có thể sử dụng thay thế này:

s1.bands.where(name: 'Wet Food').first_or_create 
Các vấn đề liên quan