0

has_many アソシエーションを持つモデルがあります: Charts has_many ChartConditions

チャート モデルには次のフィールドがあります。

  • 名前(タイトル)
  • テーブル名 (モデル)

chart_conditions モデルには次のフィールドがあります。

  • assoc_name (.join へ)
  • 名前(列)
  • 値 (値)
  • 演算子 (演算子

基本的に、チャートは動的クエリを実行するモデルを (table_name フィールドを使用して) 示します。次に、Chart の chart_conditions は、そのモデルのどのフィールドでソートするかを教えてくれます。

したがって、照会されるモデルでは、複数の chart_conditions を使用して where 句を動的に構築する必要があります。

以下では、すべてのオブジェクトの assoc_name フィールドに基づいて最初に結合を行うことがわかります

私が思いついた例。これは機能しますが、名前/値の動的演算子では機能せず、非推奨の警告もスローされます。

  def self.dynamic_query(object)
    s = joins(object.map{|o| o.assoc_name.to_sym})

    #WORKS BUT GIVES DEPRECATED WARNING (RAILS4)
    object.each do |cond|
      s = s.where(cond.assoc_name.pluralize.to_sym => {cond.name.to_sym => cond.value})
    end
  end

このクエリに動的演算子の値を追加するにはどうすればよいですか? また、なぜ言えないのですか:

s = s.where(cond.assoc_name.pluralize : {cond.name : cond.value})

=> と .to_sym を使用して動作させる必要があります。上記の構文エラー:構文エラー、予期しない ':' ...ere(cond.assoc_name.pluralize : {cond.name : cond.value}) ... ^

4

1 に答える 1

2

クエリを変数に格納し、それに追加するとどうなるでしょうか?

def self.dynamic_query(object)
  q = joins(object.map{|o| o.assoc_name.to_sym})
  object.each do |cond|
    q = q.where(cond.assoc_name.pluralize : {cond.name : cond.value})
  end
  q # returns the full query
end

別のアプローチはmerge(other)方法かもしれません。APIドキュメントから:

other が ActiveRecord::Relation の場合、other からの条件をマージします。other が配列の場合、結果のレコードと other の共通部分を表す配列を返します。

Post.where(published: true).joins(:comments).merge( Comment.where(spam: false) )
# Performs a single join query with both where conditions.

これは、すべての条件を結び付けるのに役立ちます。

于 2013-09-10T14:13:44.450 に答える