2016-05-13 8 views
1

次のメソッドは何を行い、どのように機能するのか説明できますか?私はそれを数時間研究していることを理解しようとしましたが、まだ理解できませんでした。私が理解Has Many Many ThroughアソシエーションのRuby選択メソッド

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 

答えて

2

これは、ACでありますデータベースのtiveRecordクエリ。名前とタギング数を持つタグのリストを返します。これは、タグクラウドまたはタグリーダーボードの入力データのように見えます。あなたはRubyの選択方法について考えるとき

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 

、あなたは、本質的に配列するフィルタである配列番号選択方法、を考えてすることができる。

これは、次のSQL文のようなものを生成します。 ActiveRecord selectメソッドは、データベースクエリの洗練ツールです。詳しくはSelecting Specific FieldsセクションのActive Record Query Interfaceガイドをご覧ください。

+0

したがって、このケースで使用されるselectメソッドは配列メソッドではなく、ActiveRecord selectメソッドですか? –

+1

それは正しいです。クエリで返される列がタグ名と各タグのタグ付けの数であることを指定するだけです。 –

+0

あなたは正しいと推測しました。この例はまさにタグクラウドの入力データです。 –

関連する問題