繁体   English   中英

Active Record:基于关联中另一个查询的查询

[英]Active Record: query based on another query in an association

我正在尝试根据关联中的查询进行复杂的搜索。

事件属地:用户/用户has_many:事件


按照以下字面意思:

query = User.where(:name => 'Bob')
query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0')

我尝试了几种方法,但似乎都没有用。 帮助极大的赞赏。

提前致谢。

您需要使用范围来允许这种链接:

在用户模型中:

scope :with_name, lambda { |name| where(:name => name) }

在代码中:

query = User.with_name('Bob')
query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0')

我注意到查询的编写方式存在一些问题,但我认为解决这些问题不会解决您的问题。 都一样,希望知道这些东西可以使您更接近!

首先,您需要双引号以使Ruby尊重您的#{}插值:

打开IRB并尝试:

1.9.3p194 :001 > 'COUNT(events.start_at > #{Time.now}) = 0'

将输出:

"COUNT(events.start_at > \#{Time.now}) = 0"

注意,因为我们有单引号,所以没有什么变化。

现在让我们用双引号试试,我们更接近了:

1.9.3p194 :002 > "COUNT(events.start_at > #{Time.now}) = 0"

这次我们看到:

"COUNT(events.start_at > 2012-09-24 14:47:52 -0700) = 0"

但这仍然行不通,因为SQL希望在您的时间戳周围加上引号进行比较。

我们可以这样手动处理:

1.9.3p194 :003 > "COUNT(events.start_at > '#{Time.now}') = 0"

会产生:

"COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 0"

但这可能不适用于所有SQL-我知道Postgres希望在文字周围使用单引号,但是MySQL可能更喜欢双引号,或者可能无关紧要。

解决此问题的最佳方法是让Rails弄清楚。 我们这样做的方法是使用? SQL查询字符串中的运算符:

where('COUNT(events.start_at > ?) = 0', Time.now)

Rails会生成输出,并将其发送到您的SQL数据库,如下所示:

"WHERE COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 0"

希望有帮助!

我认为这是您在同一行中寻找的所有东西:

Event.joins(:user).where(:users => {:name => 'Bob'}, :events => {:start_at => Time.at(0)..Time.now })

您不能在WHERE子句中先使用COUNT。 您需要对结果进行分组,并使用条件仅返回所需的结果。

query = User.where(:name => 'Bob')
query = query.joins("LEFT JOIN (SELECT events.id FROM events WHERE events.start_at > '#{Time.now.to_s(:db)}') AS events ON events.user_id=users.id").group("users.id").where("events.id IS NULL")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM