Сведения о вопросе

Killer

03:06, 29th August, 2020

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

Просмотров: 388   Ответов: 6

У меня есть

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

но я бы предпочел сделать это в стиле DRY. Я могу получить тот же эффект, используя

 Foo.a(something).b(something_else)

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



  Сведения об ответе

JUST___

21:06, 1st October, 2020

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

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


  Сведения об ответе

pumpa

12:34, 4th August, 2020

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


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


  Сведения об ответе

crush

23:13, 12th August, 2020

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

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

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


  Сведения об ответе

LAST

07:55, 22nd August, 2020

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

@category.products.ab(x, y)

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

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


  Сведения об ответе

$DOLLAR

07:05, 29th August, 2020

Проверять:

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


  Сведения об ответе

PROGA

01:54, 6th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться