0

join を使いたくない

任意のフィールドを他のテーブル フィールドと手動で比較したい

例えば

SELECT u.user_id、t.task_id

FROM タスク t、ユーザー u

WHERE u.user_id = t.user_id

Railsでこのクエリを書くにはどうすればよいですか??

4

3 に答える 3

2

モデルに関連付けがあると仮定すると、次のように簡単に実行できます

User.joins(:tasks).select('users.user_id, tasks.task_id')

次のようにすることもできます

User.includes(:tasks).where("user.id =tasks.user_id")

インクルードは以下の例を確認するか、こちらの熱心な読み込みを読んでください

users = User.limit(10)

users.each do |user|
  puts user.address.postcode
end

これは 11 個のクエリを実行します。これは N+1 クエリ問題と呼ばれます (最初にクエリを実行してすべての行を取得し、次に各行を再度クエリして何かを行います)。with includes Active Record は、指定されたすべての関連付けが可能な限り最小限の数のクエリを使用して読み込まれることを保証します。

今あなたがするとき;

users = User.includes(:address).limit(10)

user.each do |user|
  puts user.address.postcode
end

次のように2つのクエリのみが生成されます

SELECT * FROM users LIMIT 10
SELECT addresses.* FROM addresses
  WHERE (addresses.user_id IN (1,2,3,4,5,6,7,8,9,10))

さらに、関連付けがない場合は、以下をお読みください。

http://guides.rubyonrails.org/association_basics.htmlを確認する必要があります 。内部結合を実行しようとしていると仮定すると、デフォルトでは Rails で 2 つのモデルを関連付けてクエリを実行し、内部結合を実行しています。それらのテーブル。

モデル間の関連付けを作成する必要があります。例を以下に示します

class User
  has_many :reservations
  ...# your code
end

そして予約で

class Reservations
  belongs_to :user
  ... #your code
end

今あなたがするとき

User.joins(:reservations)

生成されたクエリは次のようになります

"SELECT `users`.* FROM `users` INNER JOIN `reservations` ON `reservations`.`user_id` = `users`.`id`"

User.joins(:reservations).to_sqlターミナルで行うことでクエリを確認できます

うまくいけば、それはあなたの質問に答えます

于 2012-12-04T07:29:12.483 に答える
1
User.find_by_sql("YOUR SQL QUERY HERE")
于 2012-12-04T08:16:11.947 に答える
0

次のように使用できます。

 User.includes(:tasks).where("user.id =tasks.user_id").order(:user.id)
于 2012-12-04T07:38:54.237 に答える