RoR ActiveRecord::Base uniq undefined при попытке uniq.pluck(:column_name)

поэтому у меня есть очень простая модель под названием Movies. Я пытаюсь добавить метод класса, который возвращает аккуратный список рейтингов, присвоенных фильмам в базе данных. Кажется, я хочу позвонить Movie.uniq.pluck(:rating)

Итак, я добавил метод следующим образом:

class Movie < ActiveRecord::Base

    def self.all_ratings
        self.uniq.pluck(:rating)
    end

end

но это просто не работает. Когда он запускается, я получаю: undefined methoduniq' для #`... Я пытался включить ActiveRecord::Calculations, но это тоже не помогает. Я также поставил точку останова после 'def...', чтобы проверить, какие методы были у меня, и, конечно же, среди них не было uniq...

Я явно делаю что-то не так, но я просто не совсем понимаю, что это такое.

У кого-нибудь есть идеи?

ó_ò

person BigglesB    schedule 07.08.2012    source источник
comment
Какую версию рельсов вы используете? (uniq был добавлен в 3.2.1, если мне не изменяет память)   -  person Frederick Cheung    schedule 07.08.2012
comment
Так что бы ответить на это тогда. Спасибо :)   -  person BigglesB    schedule 07.08.2012
comment
uniq — это метод Ruby. Я думаю, что это pluck совсем недавно.   -  person Benjamin Tan Wei Hao    schedule 09.08.2012


Ответы (2)


uniq — это метод Ruby, доступный даже для версии 1.8.7. Проблема в том, что uniq является методом Array.

Поэтому вам, вероятно, нужно вызвать uniq для чего-то вроде Movie.all.

person Benjamin Tan Wei Hao    schedule 09.08.2012
comment
Да, но в более поздней документации Rails ActiveRecord::Calculations.uniq.pluck(:column_name) определен правильно. Я не учел тот факт, что она была более поздней, чем версия, которую я использовал, отсюда и двухдневная головная боль. Конечно, как вы предлагаете, есть более подробные способы сделать то же самое. - person BigglesB; 10.08.2012
comment
На самом деле я смог использовать uniq в классе для Rails 5.0.1, но он больше не работал в 5.1.2, и мне пришлось добавить метод .all в мой класс. Спасибо! - person fatfrog; 12.07.2017

uniq — это метод массива. Когда вы помещаете self.uniq внутрь self.all_ratings, self ссылается на класс Movie, он не будет указывать ни на какую коллекцию

Итак, сначала получите коллекцию, как вы хотите

result = Movie.all

(or)

result = Movie.where({})

а затем используйте метод uniq для результата

person pdpMathi    schedule 09.08.2012