2017-11-07 7 views
0

私は3つのモデル製品、オプションとコメントがあります。製品には多くのオプションがあり、多くのコメントがあります。オプションは製品に属し、コメントは製品に属します。Ruby on Rails 5の複合スコープのクエリ

コメントモデル内のスコープを作成して、product_idがoptionモデル内のproduct_idと一致するすべてのコメントを取得し、コメントモデル内の属性「メッセージ」がオプションのいずれかであるかどうかを確認しますそのproduct_idに属しています。私は、製品変数をコメントモデルに渡すワーカーを持っています。

次のコードを使用して閉じることができますが、クエリの2番目の部分をハードコードする代わりに、動的にしたいと考えています。ここで

Comments.rb

scope :get_options, -> (product) { where(“comments.product_id = ? AND comments.message LIKE ?”), product.id, “Large Blue” } 

Large Blueはオプションテーブル内の既存のオプションの一例です。

このスコープは、私が返そうとしているものをエミュレートしていますが、ハードコーディングする代わりに、その製品に属するオプションを呼び出したいと思います。

この問題に関するベストプラクティスのご協力をお待ちしております。 sqliteの

Comment.joins(product: :options).where("comments.product_id = ? AND comments.message LIKE '%' || options.title || '%'") 

については

おかげ

+0

を見ます製品に関連する...今あなたのゲームです –

+0

私はあなたに答えを残しました。 'Product'、' Option'と 'Comment'フィールドと関連付けも貼り付けてください。 – AntonTkachov

+0

特定のオプションまたはその属性の1つをスコープに渡して、そのオプションにその製品に関するコメントがあるかどうかを確認したいとしますか?または、製品に関連付けられたコメントのいずれかに、その製品に関連するオプションのいずれかのようなメッセージがあるかどうかを調べたいと思っていますか? – inveterateliterate

答えて

0

私はこれがあなたの仕事にかなり近いはずだと思うあなたは、すべてのオプションを返す範囲内の協会によってproduct.optionsからそれを取ることができる

+0

ありがとう!これは私を近くにした。 comments.messageにはoptions.title値よりも多くのコンテンツが含まれることがあります。私はoptions.titleがcomments.messageの中に存在するかどうかを調べることが可能かどうか疑問に思っていましたか? 私はこれを試しました Comment.joins(product::options).where( "comments.product_id =?AND comments.message LIKE '%' + 'options.title' + '%'")うまくいくようです。何か案は? – LDevDesign

+0

どのデータベースサーバーを使用していますか? MySQL? (MySQLの私の答えを更新しました) – AntonTkachov

+0

現在sqlite3を使用 – LDevDesign

関連する問題