أفضل طريقة لتجاوز اسمه _scope لجمعيات HAS_MANY في القضبان؟
-
03-10-2019 - |
سؤال
ملاحظة: أنا أستخدم Rails 2.3.8 ، وليس 3.
لدي طراز صور مع default_scope:
default_scope :conditions => ["published = ?", true], :order => :position
استدعاء Photo_album.photos يرجع جميع الصور المنشورة التي تم طلبها بواسطة الموقف كما ينبغي. ومع ذلك ، عند حلول ألبومات الصور هذه في لوحة مسؤول لعرض عدد الصور في كل منها ، تكون النتائج خاطئة:
pluralize(photo_album.photos.count, "photo")
إرجاع 0 ، كما لا يتم نشر أي منها.
أعلم أنه تم طرح أسئلة مماثلة ، والرد عادة ما يكون على غرار "استخدام طريقة فئة _Exclusive_Scope". بقدر ما أستطيع أن أقول ، هذا يمنع تماما استخدام جمعيات القضبان القياسية - مما يؤدي أساسا إلى شيء مثل هذا:
pluralize(Photo.all_photos_in_album(photo_album.id).count, "photo")
ويتطلب طريقة الفصل مثل:
def Photo.all_photos_in_album(album_id)
self.with_exclusive_scope { find(:all, :conditions => ["photo_album_id = ?", album_id]) }
end
فقط لعرض إجمالي عدد الصور في الألبوم. هذا يبدو مجنونًا - يجب ألا يتطلب التغلب على التخلف عن اتفاقيات جمعية القضبان. لا يمكن استخدام with_exclusive_scope في طريقة مثيل (طريقة محمية) إما - كان من شأنه أن يسمح لي بإنشاء طريقة مثيل photalbum تسمى "all_photos" على الأقل الحفاظ على مظاهر الجمعيات (phot_album.all_photos). لكن لا ، هذا غير مسموح به :(
بصرف النظر عن إزالة default_scopes ، التي أثبتت أنها مفيدة للغاية في الموقع ، هل يعرف أي شخص طريقة تجاوز النطاقات الافتراضية والحفاظ على بناء جملة رابطة القضبان؟
شكرًا!
يحرر:
لقد انتهيت من إضافة طريقة مثيل PhotoalBum والتي ، على الرغم من أنها ليست عملية تجاوز فعلية default_scope ، فإنها تجعل بناء جملة أجمل في آرائي:
def all_photos_count
PhotoAlbum.count_by_sql("SELECT COUNT(id) FROM photos WHERE photo_album_id = #{self.id} ORDER BY created_at")
end
pluralize(photo_album.all_photos_count, "photo")
على الرغم من أنها ليست بالضبط جمعية AR has_many وتعتمد على SQL النقي ، إلا أنها أفضل حل وسط وجدتها حتى الآن.
المحلول 2
بالنسبة لي ، كان الحل الأفضل في هذه الحالة هو استخدام konly default_scope ولا ظروف acs_many والتمسك فقط بـ named_scopes. أنجز اثنان اسمه اثنان اسمهما معظم ما احتاجه للحفاظ على وجهات نظري هزيلة:
named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"
نصائح أخرى
لا أفهم لماذا لا تفعل في الألبوم:
has_many :photos
has_many :published_photos, :class_name => 'Photo', :conditions => ["published = ?", true], :order => :position
بهذه الطريقة يمكنك القيام بها:
@album.photos.count
@album.published_photos
وهلم جرا...