2016-11-13 4 views
0

Ich möchte über alle Antworten des Benutzers iterieren und es nach Anzahl der Likes, die eine Antwort erhalten hat, bestellen, aber ich kann nicht herausfinden, wie es geht, @ user.answers.likes funktioniert nicht, ich habe einen Weg gefunden finde alle Antworten des Benutzers, die Likes haben, aber das ist nicht genau das, was ich machen möchte. Danke für Ihre Hilfe.Wie sortiert man die Antworten eines Nutzers nach Likes?

models/answer.rb

class Answer < ApplicationRecord 
belongs_to :question 
belongs_to :user 
has_many :likes, dependent: :destroy 

models/user.rb

class User < ApplicationRecord 
has_many :answers 
has_many :likes 

models/like.rb

class Like < ApplicationRecord 
belongs_to :user 
belongs_to :answer 

schema.rb

create_table "answers", force: :cascade do |t| 
t.text  "content" 
t.datetime "created_at",     null: false 
t.datetime "updated_at",     null: false 
t.integer "question_id" 
t.integer "user_id" 
t.boolean "accepted", default: false 
t.index ["question_id"], name: "index_answers_on_question_id" 
end 

create_table "likes", force: :cascade do |t| 
t.integer "user_id" 
t.integer "answer_id" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
end 

Antwort

1

So etwas sollte in reinem SQL funktionieren.

sql = "SELECT * FROM answers INNER JOIN likes ON answers.id = likes.answer_id WHERE COUNT(likes.id) > 0 AND answers.user_id = #{@user.id} GROUP BY answers.id ORDER BY COUNT(likes.id)" 

records_array = ActiveRecord::Base.connection.execute(sql) 
+0

Seien Sie vorsichtig, Sie öffnen eine Tür Injektion SQL, wenn Sie einen String interpolieren direkt in eine Abfrage –

+0

Es ist kein Formular, aber keine Eingabe zu injizieren. Dies ist nur eine Abfrage, damit er die Antworten der Benutzer in der Reihenfolge der Anzahl der vorhandenen Likes anzeigen kann. – toddmetheny

+0

Ja, nur weil das "vorsichtig sein", unter diesen Bedingungen gibt es kein Problem, aber ich denke, es ist gut zu beachten, dass dies unter anderen Bedingungen eine Schwachstelle sein könnte. Wie auch immer, Aleks hat uns nicht gesagt, wie sie '@ user' bekommen, wenn er es so bekommt, dass '@ user.id' geändert werden kann, gibt es ein Problem. Es war nur ein Kommentar, Entschuldigung, wenn ich dich beleidigt habe –

1
@user.answers.joins(:likes) 
    .select('answers.*, COUNT(likes.id) as likes_count') 
    .group('answers.id') 
    .order('likes_count DESC') 

Wenn Sie nur Antworten mit Vorlieben auswählen möchten, können Sie hinzufügen mit Zustand

@user.answers.joins(:likes) 
    .select('answers.*, COUNT(likes.id) as likes_count') 
    .group('answers.id') 
    .having('COUNT(likes.id) > 0') 
    .order('likes_count DESC') 
Verwandte Themen