在Rails 3.1中,给出了这个模型:
class Subscripion < ActiveRecord::Base
scope :active, lambda {
where("start_date is not ? AND end_date >= ?", nil, Date.today)
}
def active?
self.class.active.exists?(self)
end
end
到目前为止,这是我能想到的最干燥的解决方案,因为它不会重复active?
方法中的条件。
但有两个缺点:
!start_date.nil? && end_date >= Date.today
来检查。对exists?
的调用会导致额外的数据库查询。exists?
范围内调用active
之前更改了初始订阅实例,则结果不是我们想要的结果,因为exists?
会忽略该实例并直接查询数据库。 / LI>
关于更好的解决方案的任何想法,仍然在一个地方定义条件?
答案 0 :(得分:1)
def active?
self.class.active.where(id: self.id).present?
end
此实现仅使用COUNT查询检查数据库。
无论如何,我相信对于主动更有意义吗?方法与你所写的条件(!start_date.nil?&amp;&amp; end_date&gt; = Date.today),因为它是反映当前实例的真实状态的唯一方法。