在范围或类方法中使用模型方法?

时间:2012-12-12 10:42:00

标签: ruby-on-rails activerecord

有没有办法在我的范围或类方法中使用模型的方法?

我的联系人类中有这两种方法,用于定义联系人是否处于活动状态

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

但它们不起作用,因为活动不是数据库的一部分。

我有什么聪明的方法可以来吗?并且可以与其他范围结合使用?

1 个答案:

答案 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引擎过滤结果相比,这将是低效的。