هل هناك طريقة الجمع بين اسمه نطاقات في جديد اسم نطاق ؟

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)

ولكنها ليست جميلة بشكل خاص.

هل كانت مفيدة؟

المحلول

حسنا أنا لا تزال جديدة على القضبان وأنا لست متأكدا بالضبط ما كنت هنا, ولكن إذا كنت تريد إعادة استخدام التعليمات البرمجية لماذا لا تستخدم العادية فئة الأسلوب ؟


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

يمكنك أن تجعل ذلك أكثر مرونة من خلال اتخاذ *وسائط بدلا من 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.

أنا استخدم هذا في قانون بلدي وأنها تعمل تماما.

وآمل أن يساعد.

@PJ:كنت أعرف كنت قد فكرت في ذلك ولكن رفضت ذلك لأنني اعتقدت أنني لن تكون قادرة في وقت لاحق سلسلة على الثالث اسمه نطاق مثل ذلك:

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