有没有办法在我的范围或类方法中使用模型的方法?
我的联系人类中有这两种方法,用于定义联系人是否处于活动状态
def active
return no_of_activities_last_year > 0 ? true : false
end
def no_of_activities_last_year
time_range = (Time.now - 1.year)..Time.now
activities.where(:updated_at => time_range).count
end
然后我希望能够通过范围或类方法返回所有活动的联系人,如下所示:
scope :active_contacts, lambda {where(:active => true)}
或
def self.active_contacts
where(:active => true)
end
但它们不起作用,因为活动不是数据库的一部分。
我有什么聪明的方法可以来吗?并且可以与其他范围结合使用?
答案 0 :(得分:0)
只要我知道,就没有。 ActiveRecord背后的整个想法是对数据库进行查询。您无法告诉数据库“获取此ruby代码逻辑为真的所有记录”,但是您可以告诉数据库“根据此条件获取所有记录”。
所以你仍然可以使用内部选择,可能有更好的方法,但你可以这样做:
raw_data = User.connection.execute("select user_id from (SELECT count(*) as qty, user_id FROM activities f2 WHERE user_id is not null AND created_at > DATE_SUB(NOW(), INTERVAL 1 WEEK) GROUP BY user_id HAVING qty > 1) as f1")
User.where("id in (?)", raw_data.to_a.flatten)
它不是最干净的解决方案,但它速度快,它会让你知道如何构建其他查询。
如果您不想编写原始SQL并且想要以正确的方式执行,您可以随时了解Arel或使用Squeel。
或者,您可以获取所有数据,然后按ruby代码进行过滤,但与让sql引擎过滤结果相比,这将是低效的。