2016-05-21 4 views
0

Моя база данных PostgreSQL. Я использую следующий код для устранения повторяющихся строк из таблицы:Метод возвращает объект Array

uniqBk = Bikehistory.all(
    :select => 'DISTINCT ON (bikehistories.bike_numbers) *', 
    :order => 'bikehistories.bike_numbers' 
) 

К сожалению, возвращающийся объект класса Array вместо ActiveRecord::Relation::ActiveRecord_Relation_Bikehistory.

Как я могу получить объект ActiveRecord и получать те же результаты запроса?

+0

Вам нужно выбрать 'bikehistories.bike_numbers' или целые записи, заказанные bike_numbers? –

+0

Мне нужны целые записи – Przemek903

+0

Почему вы не используете 'Bikehistory.order (: bike_numbers)'? –

ответ

0

Вы можете попробовать этот запрос:

Bikehistory.all.includes(:bikehistories).where('DISTINCT ON (bikehistories.bike_numbers) *').order('bikehistories.bike_numbers') 
+0

Используя ваш ответ, я получаю PG :: SyntaxError: ERROR: ошибка синтаксиса в точке или рядом с «DISTINCT» – Przemek903

+0

btw '.all' избыточно здесь –

0

Давайте попробовать этот запрос вместо:

uniqBk = Bikehistory.where("JOIN (SELECT id, DISTINCT bike_numbers 
            FROM bikehistories 
           ) as temp 
          ON temp.id = id") 
        .order(:bike_numbers) 
0

Ну, для меня, я бы предпочел использовать встроенный запрос, что-то вроде этого:

class Bikehistory 
    scope :unique, -> do 
     hists = self.arel_table 
     hists.where(hists[:id].in(self.distinct.pluck(:id).to_sql)).order(:bike_numbers) 
    end 
end 

Но может быть и более простым решением. Рельсы также могут обрабатывать (попробуйте):

class Bikehistory 
    scope :unique, -> { where(id: self.distinct.pluck(:id)).order(:bike_numbers) } 
end 
Смежные вопросы