2017-01-07 2 views
0

Ich habe folgende Modelle:Wählen Sie Datensätze mit weniger als N Verbände, die bestimmte Assoziation haben keine

class Rating < ApplicationRecord 
    belongs_to :user 
    belongs_to :image 
    validates :image_id, uniqueness: { scope: [ :user_id] }  
end  

class Image < ApplicationRecord 
    has_many :ratings, dependent: :destroy 
    has_many :users, through: :ratings  
end  

class User < ApplicationRecord 
    has_many :ratings, dependent: :destroy 
    has_many :images, through: :ratings  
end 

Benutzer die Bilder sind Bewertung. Ich möchte Bilder erhalten, die nicht von einem bestimmten Nutzer bewertet wurden und insgesamt von weniger als 3 Nutzern bewertet werden. Im Moment zeige ich Bilder, die von einer minimalen Anzahl von Nutzern bewertet wurden. Ich habe dies mit Cache-Zähler getan:

@image = Image.order(:ratings_count).first 

Teil Ich habe Probleme mit, wie die Bilder zu bekommen, die nicht von aktuellen Benutzern bewertet werden. Würde mich über jede Hilfe freuen. Die Anzahl der Abfragen ist nicht so wichtig, solange es die Ruby-Methode ist, um diese Datensätze zu erhalten.

Antwort

1

Es gibt ein paar Möglichkeiten, dies offensichtlich zu tun, das ist eine Möglichkeit.

already_rated = Rating.where(user_id: 1).pluck(:image_id) 
yet_to_be_rated = Image.where('id not in (?)', already_rated) 
+1

sollte es sein: 'Image.where ('id nicht in()?', Already_rated)' Aber Dank! – Levara

+0

Natürlich habe ich es aktualisiert. – Iceman

+0

Es gibt eine Möglichkeit, dies in einer Abfrage zu tun, ich habe einfach keine Rails auf meinem aktuellen Computer zum Spielen. Aber die Abfrage wäre etwas wie 'Image.joins (: rating) .where (ratings: {user_id: 1}).' 'Und so weiter – Iceman

Verwandte Themen