ActiveRecord повторяет включенные ассоциации в запросе? - PullRequest
1 голос
/ 27 октября 2010

В моем приложении у меня есть три модели: рынки, сделки и пользователи. Отношения довольно просты:

class Market
  has_many :users
  has_many :deals
end

class User
  belongs_to :market
end

class Deal
  belongs_to :market
end

Теперь, чтобы упростить запрос некоторых из этих взаимосвязей, к модели Market прикреплены несколько методов:

class Market
  def revenue_by_date(date)
    deal = self.deals.find(:all, :select => 'id, purchased, price', :conditions => ["start_time =?", date])[0]
    i = 0
    if deal && deal.isMade?
      i = deal.purchased * deal.price
    end
    return i
  end

  def users_for_market
    return self.users.count
  end
end

Итак, в моем контроллере мне нужно собрать данные, относящиеся ко всем рынкам вместе, а затем мне нужно детализировать данные в разных местах. Итак, у меня есть запрос, который выглядит так:

markets = Market.find(:all, :order => :name, :include => [:users, :deals])

Это запускает два запроса на включение, как и ожидалось, но позже в моем коде я делаю что-то вроде этого:

markets.each do |m|
  m.users_for_market
  m.revenue_by_date(date_var)
end

он выполняет отдельные запросы в этих методах модели. Я думал, что: include должен был заменить это?

Что я могу сделать, чтобы сократить количество запросов, которые я выполняю?

1 Ответ

1 голос
/ 27 октября 2010

: include - это круто, но если вы вызовете новые запросы к базе данных, это вас не остановит.Вы можете уменьшить количество обращений к БД, изменив методы Market:

class Market
  def revenue_by_date(date)
    deal = self.deals.select{|d| d.start_time == date}.first

    i = 0
    if deal && deal.isMade?
      i = deal.purchased * deal.price
    end
    return i
  end

  def users_for_market
    return self.users.size
  end
end

Давайте работать в обратном направлении - в users_for_market метод count выполняет поиск в БД, метод size просто проверяет массив.В revenue_by_date я заменил ваш запрос к базе данных методом ruby ​​select, который перебирает элементы и возвращает только те, в которых блок select равен «true».

Rails не остановит васот выполнения большего количества запросов к базе данных, но вы можете легко использовать код ruby ​​для работы с тем, что вы уже загрузили.Надеюсь, это поможет!

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