Has Many Through Association中的Ruby select方法

时间:2016-05-13 07:50:08

标签: sql ruby-on-rails ruby activerecord

您能解释以下方法的作用及其工作原理吗?我试图理解它研究了好几个小时,但我还没弄清楚。

  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

1 个答案:

答案 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指南中了解更多相关信息。