0

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

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

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

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

有什么聪明的方法可以通过这个吗?并且以可以与其他范围结合的方式更可取?

4

1 回答 1

1

据我所知,没有。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 引擎过滤结果相比效率低下。

于 2012-12-12T11:05:17.613 回答