继承rails中的模型

时间:2010-12-03 22:40:56

标签: ruby-on-rails unit-testing fixtures

我有两个相似的模型:

liked_image_user
loved_image_user

我已将常用方法放在了一个模块Rating.rb中,我将其包含在每个类中 方法是:

update_score
notify

通知正在访问

self.image
self.user

likes_image_user / loved_image_user

的成员

我有两个问题:

  • 这是正确的设计吗?它似乎    对我来说,我做的很难看    副作用,考虑评级为    基类,但实际上    只有一个模块
  • 我在写作       rating_test.rb现在,并且有       问题测试通知因为       self.image指的是夹具和       不是班上的成员,是       有一种方法我可以忽略夹具       并覆盖self.image?

1 个答案:

答案 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.likeduser.images.loved获取所有用户喜欢/喜欢的图片。

如果将两个评级合并到字符串列并为评级类型创建范围,则这可能更清晰;这取决于您的应用程序将如何正常工作。