Есть ли способ объединить именованные области в новую именованную область?

StackOverflow https://stackoverflow.com/questions/29011

Вопрос

У меня есть

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)

но это не особенно красиво.

Это было полезно?

Решение

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


        def self.ab(a, b)
            a(a).b(b)
        end
    

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

Дайте мне знать, если я полностью не согласен с тем, что вы хотите сделать.

Другие советы

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

scope :optional, ->() {where(option: true)}
scope :accepted, ->() {where(accepted: true)}
scope :optional_and_accepted, ->() { self.optional.merge(self.accepted) }

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

@category.products.ab(x, y)

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

named_scope :a, :conditions => {}
named_scope :b, :conditions => {}
named_scope :ab, :through => [:a, :b]

ДА Повторное использование 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.

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

Я надеюсь, что это поможет.

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

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

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

Проверьте:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top