القضبان 3.2 نطاق مع معلمة اختيارية

لدي النطاق التالي للعثور على منتج ينتمي إلى عميل محدد.

scope :client, lambda {|client| where("client_id = ?", client) }

ويمكن استدعاء من قبل

Product.client(parameter)

هل هناك أي طريقة يمكنني من خلالها إعلان النطاق الخاص بي لإرجاع كافة المنتجات إذا لم يتم إعطاء معرف العميل؟ هل هذا وضع لا ينبغي استخدام نطاق فيه؟

0

2 إجابة

يجب عليك استخدام شيء آخر غير النطاق ، لأنك تريد بالفعل التبديل بين الحالتين (مع/بدون تحديد معرف العميل) والاستجابة بشكل مختلف. وماذا عن هذا:

class Product < ActiveRecord::Base
  def self.by_client(client)
    if client
      where(client_id: client)
    else
      all
    end
  end
end

سيعود هذا الرمز دائمًا إلى ما يشبه إخراج نطاق ، حتى تتمكن من الاتصال به وما إلى ذلك.

لاحظ أن هذا يرتب أيضًا الشفرة ولا يتطلب نطاقًا معينًا. وتأكد من أنك لا تعني في الواقع أن يكون has_many: clients المنتج على أي حال ...

0
وأضاف
أحصل على عدد قليل جدًا من أخطاء الوسائط إذا لم يتم توفير client_id. هل فاتني شيء؟
وأضاف المؤلف ctilley79, مصدر
يجب أن تسميها مع العميل ، حتى إذا كان العميل لا . إذا كنت تحاول الاتصال به كـ Product.by_client() بدون أي وسيطة ، فما عليك سوى استخدام إصدار Product.all في هذا الرمز بدلاً من ذلك!
وأضاف المؤلف Peter, مصدر
يمكنك ضبط الطريقة لتكون self.by_client (client = nil) بحيث لا تحتاج إلى تحديد client ، ولكن هذا يبدو سخيفًا بالنسبة لي لأنك في نهاية المطاف وجود بيان إذا في مكان آخر في التعليمات البرمجية الخاصة بك لتحديد ما إذا كان سيتم تمرير العميل أم لا. إذا كنت تفعل ذلك ، فما عليك سوى الاتصال بالإصدار الذي تريده في هذا الرمز.
وأضاف المؤلف Peter, مصدر

يمكن أن تعمل بشكل جيد مع النطاقات

scope :client, lambda {|client =  nil| where("client_id = ?", client) unless client.nil? }
0
وأضاف