2017-02-06 2 views
0

Может один любезно сообщить мне, как я отображение пользователей с overall_ratings 0. Как отобразить пользователь со overall_ratings от 0? В настоящее время я могу отобразить пользователей рейтинги 0, но я не знаю, как получить тех пользователей (информация пользователя), которые имеют рейтинг нулевойSQL-запрос для полиморфного отношения - Rails 4

схема

ActiveRecord::Schema.define(version: 20170202214851) do 

    create_table "rates", force: :cascade do |t| 
    t.integer "rater_id" 
    t.integer "rateable_id" 
    t.string "rateable_type" 
    t.float "stars",   null: false 
    t.string "dimension" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "rates", ["rateable_id", "rateable_type"], name: "index_rates_on_rateable_id_and_rateable_type" 
    add_index "rates", ["rater_id"], name: "index_rates_on_rater_id" 


    create_table "users", force: :cascade do |t| 
    t.string "email",       default: "", null: false 
    t.datetime "created_at",         null: false 
    t.datetime "updated_at",         null: false 
    t.string "firstname" 
    t.string "lastname" 
    end 
end 

rate.rb

class Rate < ActiveRecord::Base 
    belongs_to :rater, :class_name => "User" 
    belongs_to :rateable, :polymorphic => true 
end 

в моей user.rb модели у меня есть метод overall_ratings который отображает над всеми рейтинг пользователя

метод user.rb

def overall_ratings 
    array = Rate.where(rateable_id: id, rateable_type: 'User') 
    stars = array.map {|user| user.stars } 
    star_count = stars.count 
    stars_total = stars.inject(0){|sum,x| sum + x } 
    score = stars_total/(star_count.nonzero? || 1) 
    end 

терминал

2.3.0 :109 > user = User.find(20) 
2.3.0 :116 > user.overall_ratings 
    Rate Load (3.0ms) SELECT "rates".* FROM "rates" WHERE "rates"."rateable_id" = ? AND "rates"."rateable_type" = ? [["rateable_id", 20], ["rateable_type", "User"]] 
=> 3.5 

я пытаюсь найти пользователей, которые имеют рейтинг 0, но я не уверен, как написать правильный SQL для отобразить эту информацию

users = User.all 
2.3.0 :189 > users.map(&:overall_ratings) 
=> [4.0, 3.75, 0, 3.0, 0, 0, 0, 0, 0, 0, 0, 0, 4.0, 0, 0, 3.0, 3.5, 0, 0, 0, 0] 


2.3.0 :197 > users.map(&:overall_ratings).delete_if{|i|i>=1} 
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

вопрос: как мне отображать пользователей с overall_ratings из 0? в настоящее время я могу отображать пользователей с рейтингами 0, но я не знаю, как получить тех пользователей, у которых есть нулевой рейтинг. Ваша помощь была бы оценена

я не уверен ... я пытаюсь ниже, но я знаю его неправильно

2.3.0 :203 > users_with_ratings_of_zero = users.map(&:overall_ratings).delete_if{|i|i>=1} 
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

2.3.0 :208 > users_with_ratings_of_zero.map(&:users) 
NoMethodError: undefined method `users' for 0:Fixnum 

ответ

1
users_with_ratings_of_zero.map(&:users) 

Это не удается, потому что вы отобразили пользователей к фактическое количество (рейтинг) в этой строке:

users_with_ratings_of_zero = users.map(&:overall_ratings) 

Приведенный выше код получается, что список в просто цифры: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] вы не можете вернуть пользователя, когда все, что у вас есть, - это номер 0

Так что вам нужно выбрать пользователей ... без фактического превращения их в числовое. Вам нужно не использовать map

Вы можете сделать это так:

users_with_ratings_of_zero = users.select {|user| 0 == user.overall_ratings } 
+1

вау! спасибо, много ... в основном для объяснения за ответом. очень ценится! – ARTLoe

+1

Добро пожаловать. :) –

Смежные вопросы