2016-11-06 19 views
0

多分奇妙なビット。しかし、2つのモデルの関係はオプションです。ユーザーモデルにはデッドラインがありますが、デッドラインのユーザーフィールドはオプションです。満たされていない場合、締め切りは一般的なものであり、すべてのユーザーに有効です。 has_manyのrelationshopを決定する際にRailsのhas_manyと外部キーとの関連付けを拡張する

、私は現在のオブジェクトのUSER_IDを持っ締切モデル内のレコードのため、だけでなく、ゼロ値のためではないだけを見てみたいです。

私はこれを試してみましたが、それは動作しません:

has_many :deadlines, -> (object){where(user: [nil, object.id])}, foreign_key:'' 

クエリは、元の場所と正しいクエリにはなりません。また、などのカスタム1を、添付含め保持します。あなたは、プレーン、プレーンSQLを使用することができ、また

has_many :deadlines, -> (object) { where("deadlines.user_id = #{object.id} OR deadlines.user_id IS NULL") } 

:あなたは常にwhere句にプレーンなSQLを置くことができます

SELECT "deadlines".* FROM "deadlines" WHERE ("deadlines"."user_id" = 1 OR "deadlines"."user_id" IS NULL) 
+0

has_many:締め切り、 - >(オブジェクト){ ( "user_id =? OR USER_ID =?」あなたはこの –

+0

ではありませんてみてくださいすることができ、ゼロ、object.id) }それとまったく同じ? –

+0

したいとき。AND条件にあなたを取るデフォルトになります配列内のクエリデータを渡すときOR条件、明示的に記述する方がよいでしょう。 –

答えて

1

SELECT "deadlines".* FROM "deadlines" WHERE "deadlines"."user_id" = $1 AND ("deadlines"."user_id" = 1 OR "deadlines"."user_id" IS NULL) [["user_id", 1]] 

は、どのように私はRailsが正しいクエリを返すことができますexecute

has_many :deadlines, lambda { |object| 
    pg_result = ActiveRecord::Base.connection.execute("SELECT * FROM deadlines WHERE deadlines.user_id = #{object.id} OR deadlines.user_id IS NULL") 
    Deadline.where(id: pg_result.map { |deadline| deadline['id'] }) 
} 
+0

これは、依然として元の関連付けANDを使用してWHERE句を追加したWHERE句。これは、私が探しているSQLにはなりません。 dデフォルトのWHEREを防止し、それを私のカスタム節に置き換える方法。 –

+0

よく見えますが、戻ってきたオブジェクトはまだどこか別のものと連鎖可能ですか?私は、SQLがすでにこのステートメント内で実行されているように思われるからではないと思います。本当にこれを解決する方法はありませんか? –

+1

@ bo-oz 'deadlines'オブジェクトはActiveRecord関係であり、完全に連鎖可能です:) –

関連する問題