2016-03-22 3 views
1

Hallo im unteren erb code Ich möchte den Wert einer Spalte counter in Lieblingstabelle mit current_user.id und die Text-ID abrufen. Die Beziehung der Modelle ist wie folgt.nicht in der Lage, den Wert der Datenbankspalte mit user_id und text_id in rails4

Ich bin neu auf Schienen und ich bin mir nicht sicher, ob wir den Wert in der Ansicht abrufen können. Bitte helfen Sie.

<p> 
    All Favorites 
    <% if ***current_user.favorite.counter == ?*** %> 
     <%= link_to #do something %> 
    <% else %> 
     <%= link_to #do something else %> 
    <% end %> 
</p> 

User.rb

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    has_many :favorites 
    has_many :favorite_texts, through: :favorites, source: :favorited, source_type: 'Text' 

Favorite.rb

class Favorite < ActiveRecord::Base 

    belongs_to :favorited, polymorphic: true 
    belongs_to :user 

Lieblings Tabelle hat die folgenden Datenbankspalten

id | text_id | favorited_type | user_id | created_at | updated_at | counter 

Auch die text_id für die user_id einzigartig ist.

Der Benutzer Controller hat den folgenden Code

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    @texts = current_user.favorite_texts 
    @favorite_groups = @user.favorite_groups 
    @fav_group = FavoriteGroup.new 
    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @user } 
    end 
    end 
end 

Vielen Dank im Voraus.

+0

Ich weiß nicht, ob ich Ihre Anfrage vollständig verstanden habe, aber dieser Code: 'current_user.favorites.where (favorited_type: 'Text', favorited_id: text_id) .first.counter' sollte den' counter' Wert des Lieblingssatz, der einen Benutzer und einen Text verbindet – MrYoshiji

+0

Ja Ich möchte den Zählerwert holen, der mit der Text-ID und der Benutzer-ID abgerufen wurde. –

+0

@MrYoshiji Wenn ich dem von Ihnen vorgeschlagenen Weg folge und die von 'where' in einer Variablen abgerufenen Daten speichere und versuche, auf den' counter' zuzugreifen, bekomme ich 'undefinierte Methode' counter 'für nil: NilClass'. Ich bin mir nicht sicher, ob ich es richtig mache. –

Antwort

0

Counting Aufzeichnungen

Wenn Sie die Zählung eines Vereins bekommen würden Sie einfach tun:

current_user.favorites.count 

, die eine SQL COUNT(*) Abfrage ausgibt:

SELECT COUNT(*) FROM "favorites" WHERE "favorites"."user_id" = ? [["user_id", 1]] 

Dies kann jedoch sein, problematisch, wenn Sie eine große Anzahl von Datensätzen durchlaufen, da dies zu einem sogenannten Problem führt.

users.all do |u| 
    if u.favorites.count.zero? # will cause a SQL query for each iteration! 
    end 
end 

ActiveRecord::Relation#size auf der anderen Seite ist die intelligente und zählt die Datensätze im Speicher, wenn sie bereits geladen wurden.

def size 
    loaded? ? @records.length : count(:all) 
end 

So würden Sie es mit .includes verwenden gemeinsam die n + 1 Problem zu vermeiden.

users.all do |u| 
    if u.favorites.size.zero? 
    end 
end 

Zähler Caches

Wenn Sie die zugehörigen Datensätze geladen und zur gleichen Zeit zu vermeiden vermeiden wollen n + 1 COUNT-Abfragen können Sie einen Zähler-Cache in den besitzenden Modell hinzuzufügen.

In diesem Beispiel würden Sie den Benutzern eine Spalte favorites_count hinzufügen und die Option auf Favoriten setzen. Es ist wenig sinnvoll, dem Join-Modell einen Zähler hinzuzufügen.

class Favorite < ActiveRecord::Base 
    belongs_to :favorited, polymorphic: true 
    # note that counter_cache needs to be set on the belongs_to side 
    belongs_to :user, counter_cache: true 
end 

Jedes Mal, wenn Sie eine Favoritenleiste einfügen oder löschen, wird der zugeordnete Benutzer aktualisiert. Es gibt jedoch geringfügige Kosten im Zusammenhang mit der UPDATE-Abfrage.

Ein Haken ist, dass alle vorhandenen Benutzer nicht den Zähler-Cache, so dass Sie durch sie durchlaufen müssen und setzen Sie den Cache:

User.find_each { |u| User.reset_counters(u.id, :favorites) } 
+0

Es gibt eine dritte Methode, bei der eine benutzerdefinierte Anweisung SELECT verwendet wird, die beim Abrufen der Datensätze die Anzahl der Verknüpfungen abruft. Allerdings möchten Sie vielleicht etwas warten. – max

+0

Ich suchte nach dem Wert einer Spalte innerhalb der Favoriten-Tabelle. Anyways danke für die Informationen und Hilfe. Ich habe versucht, hit und trial und habe endlich die Lösung für meine Abfrage, wird als Antwort unten posten. –

0

Um den Wert des Zählers Spalte in der Ansicht zu erhalten (dh html .erb) haben wir verwenden die folgende

<p> 
    All Favorites 
    <% if current_user.favorite_texts.where(id: text.id).pluck(:counter).first == 1 %> 
     <%= link_to #do something %> 
    <% else %> 
     <%= link_to #do something else %> 
    <% end %> 
</p> 

pluck ein Array zurückgibt. Also verwende ich .first, da meine Abfrage immer einen Wert wegen der Einschränkung in der Favoriten-Tabelle haben wird. Das ist text.id ist einzigartig für jede user.id.

Also das obige gibt den Wert der Zählerspalte in der Ansicht zurück. Vielen Dank.