Выбор записей на основе количества ассоциаций (присоединиться?) - PullRequest
0 голосов
/ 01 января 2012

Три модели:

class Customer < ActiveRecord::Base
  has_many :visits
end

class Visit < ActiveRecord::Base
  belongs_to :customer
  has_many :messages
end

class Message < ActiveRecord::Base
  belong_to :visit
end

Теперь я хочу вернуть все посещения клиентов, в которых у них есть сообщения.Так в псевдокоде что-то вроде этого:

@customer = Customer.find(:id)
@customer.visits.where(visit has messages)

Как мне сделать что-то подобное?

1 Ответ

2 голосов
/ 01 января 2012

Выполните внутреннее объединение : (рекомендуется):

# returns a customer's visits that have at least one message
@customer.visits.joins(:messages)

Убедитесь, что имеете дело с дубликатами

@customer.visits.joins(:messages).(“distinct(categories.id, categories.name)”)

При возможных проблемах с производительностью другой вариантиспользовать SQL EXISTS предложение:

@customer.visits.where("EXISTS (SELECT messages.id FROM messages WHERE messages.visit_id == visits.id)")

или SQL IN :

@customer.visits.where("visits.id IN (SELECT messages.visit_id FROM messages)")

http://guides.rubyonrails.org/active_record_querying.html#using-array-hash-of-named-associations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...