в рельсах, как я могу получить все параметры модели после объединения с другими моделями, получить ActiveRecord::Relation, метод подсчета которых возвращает число

Предположим, у меня есть следующие модели:

class Item
  # (name, price, location, quantity)
  has_many :purchases
end

class Purchase
  has_many :items
  belongs_to :person
end

class Person
  # (name, age)
  has_many :purchases
end

Мне нужно найти все уникальные предметы с именем «cd», купленные человеком по имени «боб».

Тогда, на мой взгляд, мне нужно:

  • @items содержать уникальные записи
  • @items.count чтобы вернуть число
  • получить доступ ко всем атрибутам каждого элемента при цикле:

    <% @items.each do |i| %>
      <%= "#{i.name}, #{i.locatiton}, #{i.quantity}" %>
    <% end %>
    
  • @items должен быть ActiveRecord::Relation (чтобы я мог разбить на страницы)

Мой запрос до сих пор выглядит примерно так:

@items = Item.joins(:purchase => :person).where('person.name' => 'bob')

оставив @items как есть, проблема состоит в том, что он содержит повторяющиеся элементы

Что я пробовал:

1) @items.uniq удаляет дубликаты, но возвращает массив, и мне нужен ActiveRecord::Relation

2) @items.select('distinct(items.name)') удаляет дубликаты, но возвращает отношение, содержащее только имя элемента, и мне нужны все атрибуты

3) @items.group('items.name') удаляет дубликаты и возвращает отношение, но метод подсчета возвращает OrderedHash, а не число. Да, я могу подсчитать ключи, но у меня есть те же представления для других отношений, которые возвращают число при вызове метода подсчета для отношения.

Я действительно не знаю, что еще попробовать, любое предложение?


person victrnava    schedule 16.02.2012    source источник
comment
Интересно, это редкость? или я делаю что-то не так? Мне просто нужны уникальные результаты, которые я могу потом разбить на страницы.   -  person victrnava    schedule 21.02.2012


Ответы (1)


Я думаю, вы можете сделать:

@items.select("DISTINCT(`items`.`name`), `items`.*")

И используйте то, что вам нужно от Items. Вы пробовали это?

person Victor Rodrigues    schedule 16.02.2012
comment
это не работает, когда я добавляю «items.name» к выбору, я снова получаю дубликаты - person victrnava; 18.02.2012