我有两个相似的模型:
liked_image_user
loved_image_user
我已将常用方法放在了一个模块Rating.rb中,我将其包含在每个类中 方法是:
update_score
notify
通知正在访问
self.image
self.user
likes_image_user / loved_image_user
的成员我有两个问题:
答案 0 :(得分:2)
对模型类使用继承是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
获取所有用户喜欢/喜欢的图片。
如果将两个评级合并到字符串列并为评级类型创建范围,则这可能更清晰;这取决于您的应用程序将如何正常工作。