У меня есть связь 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
?
Если я не подхожу к сборке неправильно, все равно, кажется, добавляется альбом. Вот что я делаю в консоли: 'track.featured_artists << artist' –
Это не помешает вам добавить художника ... ничего не может сделать, кроме исправления обезьяны' << '... но это будет сделайте проверку неудачной записи трека, и вы не сможете ее сохранить. – SteveTurczyn
Спасибо, что поняли! Я нахожусь более повседневным, насколько сложным может быть метод лопаты ... –