4

Arel でこれを行う方法 (これとこれ) または (これとこれ)

コンテキストはRails 3.0.7です

4

5 に答える 5

7

マイクの答えは基本的にあなたが探しているものでした

class Model < ActiveRecord::Base
  def self.this_or_that(a1, a2, a3, a4)
    t = Model.arel_table
    q1 = t[:a].eq(a1).and(t[:b].eq(a2))
    q2 = t[:c].eq(a3).and(t[:d].eq(a4))
    where(q1.or(q2))
  end
end

私がArelにまとめたいくつかのスライド

于 2012-10-02T12:42:46.290 に答える
2

これをすべて 1 つの where ブロックに入れます。たとえば、同様の複雑な「where」句に基づく「スコープ」は次のとおりです。

class Foo < ActiveRecord::Base
  def self.my_complex_where(args)
    where("(col1 = ? AND col2 = ?) OR (col3 = ? AND col4 = ?)", 
          args[:val1], args[:val2], args[:val3], args[:val4])
  end
end

または、次の表記法を使用して実行することもできます。

class Foo < ActiveRecord::Base
  def self.my_complex_where(args)
    where("(col1 = :val1 AND col2 = :val2) OR (col3 = :val3 AND col4 = :val4)", 
          :val1 => args[:val1], 
          :val2 => args[:val2], 
          :val3 => args[:val3],
          :val4 => args[:val4])
  end
end
于 2012-04-30T19:27:35.817 に答える
2

より生の AREL にドロップダウンする必要があります

t = Model.arel_table
a = (t[:a].eq(nil).and(t[:b].eq(nil)))
b = (t[:a].not_eq(nil).and(t[:b].not_eq(nil)))
Model.where(a.and(b))
于 2012-06-06T14:27:05.973 に答える
1

すでに与えられた答えに加えて、gem ' squeel 'も見てみたいかもしれません。

例:

Person.where{(name =~ 'Ernie%') & (salary < 50000) | (name =~ 'Joe%') & (salary > 100000)}
于 2012-04-30T22:53:46.453 に答える
0

ヘルパー メソッドについてはわかりませんが、いつでも (ほぼ) 純粋な SQL にドロップダウンできます。

Client.where("orders_count = ? AND locked = ?", params[:orders], false)
于 2012-04-30T19:19:23.817 に答える