Sql 活动记录:基于关联中的另一个查询的查询

Sql 活动记录:基于关联中的另一个查询的查询,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我正在尝试基于关联中的查询进行复杂的搜索 事件属于:用户/用户有多个:事件 按照以下文字: query = User.where(:name => 'Bob') query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0') 我试过几种方法,但似乎都不管用。非常感谢你的帮助 提前谢谢 您需要使用以允许这种链接: 在用户模型中: scope :with_name, lambda { |nam

我正在尝试基于关联中的查询进行复杂的搜索

事件属于:用户/用户有多个:事件

按照以下文字:

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')
您需要使用以允许这种链接:

在用户模型中:

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"
"WHERE COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 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数据库的输出如下所示:

1.9.3p194 :003 > "COUNT(events.start_at > '#{Time.now}') = 0"
"WHERE COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 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"
"WHERE COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 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数据库的输出如下所示:

1.9.3p194 :003 > "COUNT(events.start_at > '#{Time.now}') = 0"
"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 })

我认为这是您在一行中寻找的所有内容:

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

不能在WHERE子句afiak中使用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")

不能在WHERE子句afiak中使用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")