Попробуйте:
class User
has_one :tickets_count, :class_name => 'Ticket',
:select => "user_id, tickets_count",
:finder_sql => '
SELECT b.user_id, COUNT(*) tickets_count
FROM tickets b
WHERE b.user_id = #{id}
GROUP BY b.user_id
'
end
Редактировать:
Похоже, что ассоциация has_one
не поддерживает параметр finder_sql
.
Вы можете легко достичь желаемого, используя комбинацию scope
/ class
методов
class User < ActiveRecord::Base
def self.include_ticket_counts
joins(
%{
LEFT OUTER JOIN (
SELECT b.user_id, COUNT(*) tickets_count
FROM tickets b
GROUP BY b.user_id
) a ON a.user_id = users.id
}
).select("users.*, COALESCE(a.tickets_count, 0) AS tickets_count")
end
end
Теперь
User.include_ticket_counts.where(:id => [1,2,3]).each do |user|
p user.tickets_count
end
Это решение влияет на производительность, если у вас миллионыстрок в таблице tickets
.Следует рассмотреть возможность фильтрации набора результатов JOIN, указав WHERE
для внутреннего запроса.