Использование наследования с классами моделей - это то, как Rails выполняет STI, так что это, скорее всего, не будет соответствовать вашим ожиданиям.
Вероятно, это становится беспорядком, потому что у вас неправильно настроены отношения. Я думаю, что это более подходящий случай для отношения has_many :through
.
class User < ActiveRecord::Base
has_many :ratings
has_many :images, :through => :ratings do
def liked
where(:ratings => { :like => true })
end
def loved
where(:ratings => { :love => true })
end
end
end
class Rating < ActiveRecord::Base
belongs_to :user
belongs_to :image
attr_accessible :like, :love
validates_with RatingValidator
end
class Image < ActiveRecord::Base
has_many :ratings
has_many :users, :through => :ratings
end
class RatingValidator < ActiveModel::Validator
def validate(record)
record.errors[:base] << "only one rating per image is allowed" unless record[:like] ^ record[:love]
end
end
С небольшой проверкой и парой простых областей действия вы можете получить понравившиеся / любимые изображения любого пользователя с помощью user.images.liked
или user.images.loved
.
Это может быть чище, если вы объединили две оценки в столбец строки и создали области для типа оценки; это зависит от того, как ваше приложение будет работать точно.