2

関連付けのクエリに基づいて複雑な検索を実行しようとしています。

イベントの所属先 :user / ユーザーの has_many :events


文字通りの行に沿って:

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

いくつかのアプローチを試しましたが、どれもうまくいかないようです。大変助かります。

前もって感謝します。

4

4 に答える 4

0

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")
于 2012-09-25T00:13:23.880 に答える
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"

お役に立てば幸いです。

于 2012-09-24T22:07:37.460 に答える
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')
于 2012-09-24T21:29:18.070 に答える
0

私はこれがあなたが探しているものだと思います:

Event.joins(:user).where(:users => {:name => 'Bob'}, :events => {:start_at => Time.at(0)..Time.now })
于 2012-09-24T23:54:08.513 に答える