Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在作用域或类方法中使用models方法?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 在作用域或类方法中使用models方法?

Ruby on rails 在作用域或类方法中使用models方法?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,有没有办法在我的范围内或在我的类方法中使用模型的方法 我的contact类中有这两个方法,用于定义联系人是否处于活动状态 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 => ti

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

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

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)} 

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


有什么聪明的方法可以让我得到这个吗?最好能与其他作用域相结合?

据我所知,没有。ActiveRecord背后的整个思想是对数据库进行查询。您不能告诉数据库“获取此ruby代码逻辑为true的所有记录”,但可以告诉数据库“获取此条件下的所有记录”

因此,您仍然可以使用内部选择,可能有更好的方法,但您可以:

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或使用SQuel


或者,您可以获取所有数据,然后使用ruby代码进行过滤,但这与让sql引擎过滤结果相比效率低下。

您不能给出条件,除非
active
是该表的一列。
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)