[英]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.