سؤال

في تطبيق Rails 3.2.8 الخاص بي، لدي بعض النطاقات المسماة التي أرغب في ربطها معًا في بعض الظروف.

لذلك، على سبيل المثال، لدي هذين النطاقين:

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) }

أستخدمهما بشكل منفصل، لكني أود أيضًا أن أتمكن من الاتصال بهما معًا على النحو التالي:

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")

عندما أحاول ذلك، فإنه يشكو من أن in_date_range ليس طريقة للصفيف.

ولكن لدي مجال آخر

scope :active, includes([:person, :pier_module]).where("status = 'New Request'")

وإذا فعلت

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")

إنها تعمل!من الواضح أن النطاق النشط يُرجع علاقة، في حين تُرجع نطاقات لامدا المصفوفات، وبالتالي لا يمكن ربطها بالسلاسل.

أود أن أعرف سبب الفرق بين النطاقات الأبسط ونطاقات لامدا، وكيف تؤثر المعلمات عليه، وما إذا كان هناك أي شيء يمكنني القيام به باستثناء كتابة نطاق مدمج، وهو ما قمت به.

scope :by_status_in_date_range, lambda { |status, start_date, end_date|  includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) }

يعمل، ولكن ليس جافًا جدًا (لأنني بحاجة إلى النطاقات الفردية أيضًا) أو Rails-ish.أثناء البحث هنا وفي أماكن أخرى، رأيت أسئلة مماثلة ولكن لا يبدو أن أيًا منها ينطبق على هذا الموقف، حيث أحاول ربط اثنين من لامدا باستخدام المعلمات.

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

المحلول

يحدث ذلك لأنه في نطاقك

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }

طرق all و find_all_by_status عائدات Array بدلاً من ActiveRecord::Relation.يجب عليك استبداله ب where على سبيل المثال.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top