3

Rails アプリで Squeel を使用すると、条件のハッシュが得られます。

{'trans' => 'manual'}

最終的には配列に移動する予定です...そのため、演算子の割り当てもできます。

[[field,operator,value][field,operator,value]]

Model メソッドを使用したいのですが、今のところ演算子を省略していますが、これを機能させるために == を試みているだけです...しかし、以下にあるものは機能しません。

def self.with_conditions(conditions)
    joins{car}.where do
      conditions.map {|key,value| (key==value) }.inject(:&)
    end
end

私もこれを試しました:

def self.with_conditions(conditions)
  joins{car}.where do
    query = nil

    conditions.each do |key, value|
      q = (key == value)

      if query
        query &= q
      else
        query = q
      end
    end

    query     
  end
end

では、これを == で動作させるにはどうすればよいでしょうか。また、最終的にこれを動的演算子でも動作させるにはどうすればよいでしょうか? ありがとう

コンソールでは、私の SQL は私の条件を読み込んでいません... 例:

コンソールで:

> Timeslip.with_conditions({'car.year'=>'1991'})

SELECT "timeslips".* FROM "timeslips" INNER JOIN "cars" ON "cars"."id" = "timeslips"."car_id"
4

2 に答える 2

3

Squeel クエリをプログラムで作成する必要があります。例えば:

def self.with_conditions(conditions)
  conditions.map do |col, str|
    Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub.new(col), :matches, str) # (email.matches "user@example.com")
  end.inject do |t, expr|
    t & expr # joins each expression from the .map above with & - to be converted to AND in the sql
  end.tap do |block|
    return where{(block)} # pass the constructed expression to Squeel
  end
end

私のUser::Userモデルでは実行できます

User::User.with_conditions({email: "user@example.com", first_name: "Deefour"}).to_sql

そして私は得る

SELECT "user_users".* FROM "user_users"  WHERE (("user_users"."email" LIKE 'user@example.com' AND "user_users"."first_name" LIKE 'Deefour'))
于 2013-02-01T20:21:14.310 に答える
0

これが役立つかどうかはわかりませんが、このヘルパーメソッドを使用してこのようにしました:

  def query_for_matches(key, value)
    stub = Squeel::Nodes::Stub.new(key)
    Squeel::Nodes::Predicate.new(stub, :matches, "%#{value}%")
  end

何かのリクエストからのパラメーターのハッシュがあります。

  dynamic_params = {'username' => 'some_name', 'email' => 'email@example.com'}

where次に、ループ内の一連の 's でこれを使用します。

  query = SomeModel #could be User, etc
  dynamic_params.each_pair {|key,value| query = query.where(query_for_matches(key, value)) }

queryその後、ビューなどに渡すことができます。私は数週間しかレールに乗っていないので、これがベストプラクティスかどうかはわかりませんが、うまくいきます。

于 2014-01-03T12:12:32.717 に答える