كيف يمكن للمرء الحصول على عدد صف من has_many: من خلال العلاقات مع: uniq => true

StackOverflow https://stackoverflow.com/questions/2199338

سؤال

هذا هو نموذجي:

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.

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