1

У меня есть связь has_many through между моим художником и моделями альбомов. Чтобы добавить к этому альбому has_many tracks. На дорожках также есть ассоциация has_many through между художниками (то есть признанный художник), где модель Feature служит в качестве таблицы соединений.Подтвердить объект на основании владельца его родителя

Я хочу, чтобы художник (ы) альбома не был признанным художником на треке. Так, например:

album = Album.find_by(name: "Justified") 
track = Album.track.first 
artist = Artist.find_by(name: "Justin Timberlake") 

track.featured_artists << artist 

# ^^ Should raise error since Justin Timberlake is the album's artist 

Настройка модели

class Album < ActiveRecord::Base 
    has_many :album_artists 
    has_many :artists, through: :album_artists 
end 

class Track < ActiveRecord::Base 
    belongs_to :album 

    has_many :features 
    has_many :featured_artists, through: :features, class_name: "Artist", foreign_key: "artist_id" 
end 

class AlbumArtist < ActiveRecord::Base 
    belongs_to :album 
    belongs_to :artist 

    validates_uniqueness_of :artist_id, scope: :album_id 
end 

class Feature < ActiveRecord::Base 
    belongs_to :track 
    belongs_to :featured_artist, class_name: "Artist", foreign_key: "artist_id" 
end 

class Artist < ActiveRecord::Base 
    has_many :album_artists 
    has_many :albums, through: :album_artists 

    has_many :features 
    has_many :tracks, through: :features 
end 

Есть ли способ сделать это с помощью одного из методов проверки вышедших из коробки? Если не так, как я буду заниматься созданием настраиваемого валидатора без написания смехотворно длинной поисковой цепи владельцу альбома, предполагая, что валидатор находится в модели Feature?

ответ

0

Вы можете проверить, что пересечение (&) из двух массивов художников пуст.

class Track < ActiveRecord::Base 
    belongs_to :album 

    has_many :features 
    has_many :featured_artists, through: :features, class_name: "Artist", foreign_key: "artist_id" 

    validate :featured_artists_cannot_include_album_artists 

    def featured_artists_cannot_include_album_artists 
    if (album.artists & featured_artists).present? 
     errors.add(:featured_artists, "can't include album artists") 
    end 
    end 
end 
+0

Если я не подхожу к сборке неправильно, все равно, кажется, добавляется альбом. Вот что я делаю в консоли: 'track.featured_artists << artist' –

+0

Это не помешает вам добавить художника ... ничего не может сделать, кроме исправления обезьяны' << '... но это будет сделайте проверку неудачной записи трека, и вы не сможете ее сохранить. – SteveTurczyn

+0

Спасибо, что поняли! Я нахожусь более повседневным, насколько сложным может быть метод лопаты ... –

Смежные вопросы