(以下の例スキーマ画像を参照)レール5.1にhas_many - 関連フィールド
Iはapplications
からid
& key
フィールドと共に、email
フィールドを使用してusers
テーブルから単一のユーザを照会しようとしてい表。結果には、見つかったユーザー(見つかった場合)と、アプリケーション(key
& id
フィールドを使用して参照される)とapplications_users
の関連データが含まれている必要があります。
私は簡単にこの操作を実行するために、手動でSQLを書くことができます。ActiveRecordのを使用しているとき
SELECT
"users".*,
"applications_users"."scopes",
"jwt_applications".*
FROM
"users"
INNER JOIN
"applications_users" ON "applications_users"."user_id" = "users"."id"
INNER JOIN
"jwt_applications" ON "jwt_applications"."id" = "applications_users"."application_id"
WHERE
"users"."email" = '[email protected]'
AND "jwt_applications"."id" = '01daafc9-2169-4c78-83e9-37ac0a473e3d'
AND "jwt_applications"."key" = 'follow_the_rainbow'
LIMIT 1
しかし、私は私の人生のためにクエリが正しく取得することはできません。
これらは私がこれまでに作った失敗した試みです:
user = User.where(email: args[:username]).joins(:applications).merge(
JwtApplication.where(id: args[:application][:id], key: args[:application][:key])
).take!
は、これは正しくユーザーを取得し、私はuser.applications
にアクセスしようとしたときしかしRailsは2番目のSQLクエリを実行する(そして、それはまた、関連付けられているすべてのアプリケーションを返します。ユーザー; id
& key
条件を無視するように見える)
user = User.where(email: args[:username]).joins(:applications).merge(
JwtApplication.where(id: args[:application][:id], key: args[:application][:key])
).references(:applications_users).take!
これは正しくもユーザー正しいアプリケーション(イェーイ)、HOを取得!私はuser.applications_users
を呼び出そうとする場合wever Railsは2番目のSQLクエリを実行 - (id
& key
条件を無視し、再び)それはまたapplications_users
テーブル内のすべてのデータの収集を返し
user = User.where(email: args[:username]).joins(:applications).where(
jwt_applications: {
id: args[:application][:id],
key: args[:application][:key]
}
).take!
これは正しいユーザーを取得し、しかし、すべてのアプリケーションを返すuser.applications
にアクセスしようとすると、Railsは別のSQLクエリを実行します。
とにかく、Railsの天才がこの質問に光を当ててくれることを願っています。私は決してRailsの専門家ではないことを最初に認めます。これは愚かな質問:)
うわー、それはエレガントで完璧に動作します! –