join を使いたくない
任意のフィールドを他のテーブル フィールドと手動で比較したい
例えば
SELECT u.user_id、t.task_id
FROM タスク t、ユーザー u
WHERE u.user_id = t.user_id
Railsでこのクエリを書くにはどうすればよいですか??
join を使いたくない
任意のフィールドを他のテーブル フィールドと手動で比較したい
例えば
SELECT u.user_id、t.task_id
FROM タスク t、ユーザー u
WHERE u.user_id = t.user_id
Railsでこのクエリを書くにはどうすればよいですか??
モデルに関連付けがあると仮定すると、次のように簡単に実行できます
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
ターミナルで行うことでクエリを確認できます
うまくいけば、それはあなたの質問に答えます
User.find_by_sql("YOUR SQL QUERY HERE")
次のように使用できます。
User.includes(:tasks).where("user.id =tasks.user_id").order(:user.id)