2016-05-13 6 views
1

Können Sie erklären, was die folgende Methode und wie es funktioniert? Ich habe versucht, es mehrere Stunden lang zu erforschen, aber ich konnte es noch nicht herausfinden.Ruby Select-Methode in Hat viele durch Assoziation

Was ich verstehe, ist die Ruby-Methode "wählen" nimmt in der Regel einen Block, nicht wie die in dieser Methode verwendet. Die Methode self.tag_counts ist im Ereignismodell meiner Anwendung wie folgt.

models/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 

models/tag.rb

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :events, through: :taggings 
end 

models/tagging.rb

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :event 
end 

Antwort

2

Dies ist ein Ac tiveRecord Abfrage der Datenbank. Es gibt die Liste der Tags mit Name und Anzahl der Markierungen zurück. Es sieht wie die Eingabedaten für eine Tag-Cloud oder eine Tag-Rangliste aus.

Dies wird so etwas wie die folgende SQL-Anweisung erzeugen:

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 

Wenn Sie von der Ruby-select-Methode denken, können Sie von der Array # select-Methode denken, die im Wesentlichen ein Filter für Arrays ist. Die ActiveRecord-Methode select ist ein Tool zur Optimierung von Datenbankabfragen. Sie können mehr darüber in der Active Record Query Interface Anleitung im Selecting Specific Fields Abschnitt lesen.

+0

Also die Auswahl Methode in diesem Fall ist nicht die Array-Methode, sondern die ActiveRecord Select-Methode? –

+1

Das ist richtig. Es gibt nur an, dass die in der Abfrage zurückgegebenen Spalten der Tag-Name und die Anzahl der Tags auf jedem Tag sind. –

+0

Sie haben richtig geraten. Das Beispiel ist genau die Eingabedaten für eine Tag Cloud. –

Verwandte Themen