ОБНОВЛЕНИЕ : Итак, благодаря @Erwin Brandstetter, у меня теперь есть это:
def self.unique_users_by_company(company)
users = User.arel_table
cards = Card.arel_table
users_columns = User.column_names.map { |col| users[col.to_sym] }
cards_condition = cards[:company_id].eq(company.id).
and(cards[:user_id].eq(users[:id]))
User.joins(:cards).where(cards_condition).group(users_columns).
order('min(cards.created_at)')
end
... который, кажется, делает именно то, что я хочу. Однако есть два недостатка, которые я бы хотел устранить:
- Предложение
order()
использует прямой SQL вместо Arel (не смог понять).
Вызов .count
по приведенному выше запросу дает мне эту ошибку:
NoMethodError: неопределенный метод to_sym для
# из
/Users/neezer/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.1/lib/active_record/relation/calculations.rb:227:in
'Execute_grouped_calculation'
... что, вероятно, связано с тем, как я отображаю users_columns
, поэтому мне не нужно вручную вводить все из них в предложении group
.
Как я могу исправить эти две проблемы?
ОРИГИНАЛЬНЫЙ ВОПРОС :
Вот что у меня есть, что решает первую часть моего вопроса:
def self.unique_users_by_company(company)
users = User.arel_table
cards = Card.arel_table
cards_condition = cards[:company_id].eq(company.id)
.and(cards[:user_id].eq(users[:id]))
User.where(Card.where(cards_condition).exists)
end
Это дает мне 84 уникальных записи, и это правильно.
Проблема в том, что мне нужны эти User
записи, упорядоченные по cards[:created_at]
(в зависимости от того, что раньше для этого конкретного пользователя). Добавление .order(cards[:created_at])
к объему в конце описанного выше метода абсолютно ничего не делает.
Я попытался добавить .joins(:cards)
, но это дает 587 записей, что неверно (дубликаты User
с). group_by
, насколько я понимаю, здесь также практически бесполезно из-за того, как PostgreSQL справляется с этим .
Мне нужно, чтобы мой результат был ActiveRecord::Relation
(чтобы он был цепным), который возвращает список уникальных пользователей, у которых есть карты, принадлежащие данной компании, упорядоченные по дате создания их первой карты. ... с запросом, написанным на Ruby и не зависящим от базы данных. Как я могу это сделать?
class Company
has_many :cards
end
class Card
belongs_to :user
belongs_to :company
end
class User
has_many :cards
end
Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация, или если я не совсем понял свой вопрос.