سؤال

ملاحظة: أنا أستخدم 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

وهلم جرا...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top