У меня есть контроллер conversations
, который используется для получения всех разговоров для пользователя типа seller
.
Продавцы могут иметь products
, который может быть purchased
на buyers
, а product
может быть бесплатным. Для списка разговоров каждый buyer
помечается как client
или lead
в зависимости от следующих факторов:
buyer
приобрел платный товар или подписался на товар => client
else
=> lead
Мой converastions_controller
:
@conversation = Conversation.includes(:messages)
.get_coach_conversations(@seller)
Моя Conversation
модель имеет метод:
def self.get_seller_conversations(seller)
@conversations = seller.conversations
.includes(buyer: [:purchases, :user])
.joins(:messages)
.where(messages: {only_for_buyer: false})
.distinct
new.sorted_conversations(@conversations)
end
def sorted_conversations(conversations)
conversations.sort_by { |c| c.messages.last.created_at }
.reverse
end
И затем в моем jbuilder
для метода seller/conversations
index
у меня есть следующая проверка, чтобы проверить, является ли buyer
client
или lead
coach/conversations/index.json.jbuilder
json.array!(@conversations.map do |c|
...
...
already_client: c.buyer.purchases
.where(seller: @seller)
.where('subscription = ? OR product_price > ?',
true, 0)
.exists?
end)
Я думаю, что могу ожидать, что это будет медленный запрос, потому что я извлекаю много содержимого для проверки, но join
, кажется, извлекает все атрибуты каждого model
, который включен в запрос ActiveRecord , Хотите знать, есть ли лучший способ проверить это без необходимости извлекать все данные.
Для моих моделей включены модели для следующей информации:
buyer
-> users
подключены к conversations
через buyer/seller
модель
purchases
-> проверить, является ли buyer
client/lead
user
-> buyers
name
и display picture