Рельсы тянут каждый атрибут включенных данных - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть контроллер 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

1 Ответ

0 голосов
/ 25 апреля 2018

Что бы вы ни делали, вы должны переместить это из поля зрения и в метод, вероятно, на покупателя. Но из того, что мы можем сказать, это не должно создавать объекты ruby, если это просто отношение активной записи. Создайте область для покупателя и передайте @seller

c.buyer.purchases
       .where(seller: @seller)
       .where('subscription = ? OR product_price > ?',true, 0)
       .exists?

перейти к модели, возможно, купить?

class Purchase
  scope :already_client, -> (seller) {
    .where(seller: seller)
    .where('subscription = ? OR product_price > ?',true, 0)
    .exists?
  }
end

внутри вашего JSON Builder:

already_client: c.buyer.purchases.already_client(@seller)
...