Есть ли способ объединить именованные области в новую именованную область? - PullRequest
7 голосов
/ 27 августа 2008

у меня

class Foo < ActiveRecord::Base
  named_scope :a, lambda { |a| :conditions => { :a => a } }
  named_scope :b, lambda { |b| :conditions => { :b => b } }
end

Я бы хотел

class Foo < ActiveRecord::Base
  named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
end

но я бы предпочел сделать это СУХОЙ модой. Я могу получить тот же эффект, используя

 Foo.a(something).b(something_else)

но это не особо мило.

Ответы [ 6 ]

8 голосов
/ 29 мая 2015

По крайней мере, начиная с 3.2, есть умное решение:

scope :optional, ->() {where(option: true)}
scope :accepted, ->() {where(accepted: true)}
scope :optional_and_accepted, ->() { self.optional.merge(self.accepted) }
2 голосов
/ 27 августа 2008

Ну, я все еще новичок в rails, и я точно не знаю, для чего вы здесь, но если вы просто собираетесь повторно использовать код, почему бы не использовать обычный метод класса?

<code>
        def self.ab(a, b)
            a(a).b(b)
        end
    

Вы могли бы сделать это более гибким, взяв * args вместо a и b, а затем, возможно, сделать один или другой необязательным. Если вы застряли на named_scope, не могли бы вы расширить его, чтобы сделать то же самое?

Дай мне знать, если я совершенно не в курсе того, что ты хочешь сделать.

1 голос
/ 20 июля 2010

Да Повторное использование named_scope для определения другого named_scope

Я копирую это здесь для вашего удобства:

Вы можете использовать proxy_options, чтобы перерабатывать один named_scope в другой:

class Thing
  #...
  named_scope :billable_by, lambda{|user| {:conditions => {:billable_id => user.id } } }
  named_scope :billable_by_tom, lambda{ self.billable_by(User.find_by_name('Tom').id).proxy_options }
  #...
end

Таким образом, он может быть связан с другими named_scopes.

Я использую это в своем коде, и он отлично работает.

Надеюсь, это поможет.

1 голос
/ 11 мая 2009

Сделав его методом класса, вы не сможете связать его с прокси-сервером ассоциации, например:

@category.products.ab(x, y)

Альтернативой является применение этого патча для включения опции: through для named_scope:

named_scope :a, :conditions => {}
named_scope :b, :conditions => {}
named_scope :ab, :through => [:a, :b]
0 голосов
/ 09 сентября 2010

Выезд:

http://github.com/binarylogic/searchlogic

Впечатляет!

Чтобы быть конкретным:

class Foo < ActiveRecord::Base
  #named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
  # alias_scope, returns a Scope defined procedurally
  alias_scope :ab, lambda {
    Foo.a.b
  }
end
0 голосов
/ 27 августа 2008

@ PJ : вы знаете, я обдумал это, но отклонил его, потому что думал, что не смогу позже соединиться с третьей именованной областью, например:

Foo.ab(x, y).c(z)

Но поскольку ab(x, y) возвращает то, что вернуло бы b(y), я думаю, что цепочка сработает. Способ заставить меня переосмыслить очевидное!

...