1

モデルに2つのスコープのようなメソッドを定義しました。

def self.foo var
  where(foo: var)
end

def self.bar var
  where(bar: var)
end

これらのメソッドの1つにnilを渡して、事実上無視できるようにしたいと思います。それで:

var1 = 10
var2 = nil
# ...
Model.foo(var1).bar(var2)

私は次のようなさまざまなことを試しました:

def self.bar var
  return self if var.nil?
  where(bar: var)
end

しかし、上記の例でselfは、このメソッドがチェーン内の前のメソッドから渡されたものを返さず、それが返されるModelため、で行われたすべてのレッグワークが失われfooます。

どうすれば私が試みていることを達成できますか?

4

2 に答える 2

1

Rails 3.xを信じているので、次のようなものを使用できるはずです。

return self.scoped if var.nil?

Rails 4.xでは、これを次のように変更する必要があります。

return self.all if var.nil?

基本的に、'scoped'(およびrails 4'all')は、実際に条件を適用せずに、他のarelメソッドとチェーンできるリレーションオブジェクトを返します。

于 2013-02-07T15:49:32.707 に答える
1

all実際にクエリを実行するのActiveRelationに対して、オブジェクトを返すのではなく、実際に結果を返す必要があるときにクエリを遅延ロードするために使用されます(例:実際に実行するときeach)。それ以外の場合は、クエリをまったく実行しないため、データベースへの呼び出しが節約されます。それはまたあなたが基本的にここで達成しようとしている素晴らしい連鎖を可能にします。

あなたが試してみたいと思うかもしれないのは

def self.bar(val)
  return where({}) if val.nil?
  where(:bar => val)
end
于 2013-02-07T16:03:27.587 に答える