您能解释以下方法的作用及其工作原理吗?我试图理解它研究了好几个小时,但我还没弄清楚。
def self.tag_counts
Tag.select("tags.name, count(taggings.tag_id) as count").joins(:taggings).group("taggings.tag_id")
end
我所理解的是红宝石方法'选择'通常需要一个块,而不是像这个方法中使用的那个块。 self.tag_counts方法在我的应用程序的事件模型中如下。
模型/ event.rb
class Event < ActiveRecord::Base
extend FriendlyId
friendly_id :title, use: :slugged
belongs_to :organizers, class_name: "User"
has_many :taggings
has_many :tags, through: :taggings
def all_tags
tags.map(&:name).join(",")
end
def all_tags=(names)
self.tags = names.split(",").map do |n|
Tag.where(name: n.strip).first_or_create!
end
end
def self.tagged_with(name)
Tag.find_by_name!(name).events
end
def self.tag_counts
Tag.select("tags.name, count(taggings.tag_id) as count").joins(:taggings).group("taggings.tag_id")
end
end
模型/ tag.rb
class Tag < ActiveRecord::Base
has_many :taggings
has_many :events, through: :taggings
end
模型/ tagging.rb
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :event
end
答案 0 :(得分:2)
这是数据库的ActiveRecord查询。它返回带有标签名称和数量的标签列表。它看起来像标签云或标签排行榜的输入数据。
这将产生类似以下SQL语句的内容:
SELECT tag.name, count(taggings.tag_id) as count
FROM tags
LEFT JOIN taggings ON tags.id = taggings.tag_id
GROUP BY taggings.tag_id
当你想到Ruby select方法时,你可能会想到Array#select方法,它本质上是一个数组的过滤器。 ActiveRecord select方法是一种数据库查询优化工具。您可以在Active Record Query Interface部分的Selecting Specific Fields指南中了解更多相关信息。