كيف يمكن للمرء الحصول على عدد صف من has_many: من خلال العلاقات مع: uniq => true
-
25-09-2019 - |
سؤال
هذا هو نموذجي:
class Tag < ActiveRecord::Base
# id, name
has_many :taggings
end
class Tagging < ActiveRecord::Base
# id, tag_id, owner_id, target_type, target_id
belongs_to :tag
belongs_to :owner, :class_name => 'User'
belongs_to :target, :polymorphic => true
validates_uniqueness_of :tag_id, :scope => [ :target_id, :target_type, :owner_id ]
end
class Asset < ActiveRecord::Base
# id, owner_id, title, type, etc
belongs_to :owner, :class_name => 'User'
has_many :taggings, :as => :target
has_many :taggers, :through => :taggings, :source => :owner, :uniq => true
has_many :tags, :through => :taggings, :uniq => true
end
class User < ActiveRecord::Base
# id, name, email, etc
has_many :assets, :foreign_key => 'owner_id'
has_many :my_taggings, :class_name => 'Tagging', :foreign_key => 'owner_id'
has_many :my_tags, :through => :my_taggings, :source => :tag, :uniq => true
has_many :taggings, :as => :target
has_many :taggers, :through => :taggings, :source => :owner, :uniq => true
has_many :tags, :through => :taggings, :uniq => true
end
جميع العلاقات تعمل ولكن لدي شرط إضافي لا يمكنني العثور على الحل لـ:
النظر في هذه العلاقة في فئة الأصول
has_many :tags, :through => :taggings, :uniq => true
استدعاء Asset.find (: أولاً). تُرجع tags مجموعة من العلامات كما هو متوقع ، لكنني بحاجة إلى أن تحتوي كل علامة على سمة عدد تشير إلى عدد المرات التي كان فيها الصف قد ظهر إذا: uniq => لم يتم تحديد True.
على سبيل المثال. يمكن لأكثر من مستخدم تطبيق نفس العلامة على أصل. أرغب في عرض اسم العلامة بالإضافة إلى عدد المستخدمين الذين طبقوها.
المحلول
هذا يجب أن يفعل بالضبط ما تريد.
has_many :tags_with_count, :source => :tag, :through => :taggings,
:group => "tags.id", :joins => :taggings,
:select = "tags.*, COUNT('taggings.id') AS frequency"
فيما يتعلق بالصفوف التي تم إرجاعها: Group =>: سيعود المعرف نفس المجموعة مثل: uniq => true ، ولكنه سيسمح لك أيضًا بإجراء الحسابات التي تريدها. هذا البيان كثيف العمالة أكثر من: uniq => true ، لذلك أعطيته اسمًا مختلفًا يسمح لك باختيار ما إذا كنت تريد جلب العلامات الفريدة مع تهمها المجمعة ، أو مجرد قائمة العلامات الفريدة.
سيضيف البيان أعلاه سمة التردد إلى السجلات التي تم إرجاعها. من خلال سحر method_missing ، يمكنك الوصول إلى ذلك باستخدام @tag.frequency.
الاستخدام:
@tags = @asset.tags_with_count
@tags.each{|tag| puts [tag.id, tag.name. tag.frequency].join "\t"}
سيقوم بطباعة المعرف والاسم وعدد أحداث كل علامة لـ ASSET.