1

(以下の例スキーマ画像を参照)レール5.1にhas_many - 関連フィールド

Iはapplicationsからid & keyフィールドと共に、emailフィールドを使用してusersテーブルから単一のユーザを照会しようとしてい表。結果には、見つかったユーザー(見つかった場合)と、アプリケーション(key & idフィールドを使用して参照される)とapplications_usersの関連データが含まれている必要があります。

Example schema

私は簡単にこの操作を実行するために、手動で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の専門家ではないことを最初に認めます。これは愚かな質問:)

答えて

1

わからないようオフになれば、これはあなたが探している何かが、であれば、私はPHP & C++での私のプロとしてのキャリアのコーディングの最後の10年間を過ごしてきたので、私と一緒に負担してください。.. 。クエリに渡すparamsは、電子メールとして、キーとID

User.joins(:applications).where(email: email).where(applications: { key: key, id: id})

: あなたは(参加モデルは、暗黙的クエリに追加する必要がある)などのActiveRecordのクエリを書くことができます。

そのクエリの上にあなたが必要なすべてを取得するために選択フィールドを使用することができます。

user = User.joins(:applications).where(email: email).where(applications: { key: key, id: id}).select('users.*, applications.id as appid applications.key as appkey').first

何があなたの基準に一致しない場合は、ユーザーモデル(存在する場合)または空の関係をあなたに戻って得られます。 あなたはその後、

user.appid

user.appkey

などの分野を呼び出すことができますあなたはいつもしますあなたの単一のインスタンス内のすべてのフィールドを返しますどの('users.*, application_users.scopes, applications.*)を選択します(まだUserモデルの下で)ですが、idのような重複したフィールドを呼び出すことができます一度しか表示されないので、必要なフィールドだけを取得し、appidとappkeyで表示したような一意の識別子を与える方がよいです。

また、正確にはあなたの後ろではないかもしれませんが、うまくいけば正しい方向にあなたを指しています!

+0

うわー、それはエレガントで完璧に動作します! –

関連する問題