У меня есть много предметов и много пользователей в базе данных. Пользователь может установить статус для различных элементов. Три таблицы (они были упрощены в этом объяснении) - пользователи, статусы, элементы. Модели показаны ниже.
class Item < ActiveRecord::Base
has_many :statuses
end
class Status < ActiveRecord::Base
belongs_to :user
belongs_to :item
end
class User < ActiveRecord::Base
has_many :statuses
end
Контроллер
class ItemController < ApplicationController
def index
@items = Item.all
end
end
Представление (это было упрощено, в моем коде я фактически генерирую форму для статуса, чтобы пользователь мог создавать / изменять свой статус, но в приведенном ниже примере я просто делаю так, как будто статус распечатывается как текст):
<th>Item ID</th>
<th>Item Status</th>
...
<% @items.each do |item| %>
<td><%= item.id %></td>
<% status = item.statuses.where(:user_id => current_user.id) %>
<td><%= status.first.status %></td>
<% end %>
Вот запросы, сгенерированные Rails:
Item Load (0.3ms) SELECT `items`.* FROM `items` ORDER BY id asc
SQL (0.2ms) SELECT COUNT(*) FROM `statuses` WHERE (`statuses`.item_id = 1) AND (`statuses`.`user_id` = 103)
SQL (0.2ms) SELECT COUNT(*) FROM `statuses` WHERE (`statuses`.item_id = 2) AND (`statuses`.`user_id` = 103)
Status Load (0.1ms) SELECT `statuses`.* FROM `statuses` WHERE (`statuses`.item_id = 2) AND (`statuses`.`user_id` = 103) LIMIT 1
SQL (0.2ms) SELECT COUNT(*) FROM `statuses` WHERE (`statuses`.item_id = 3) AND (`statuses`.`user_id` = 103)
Все элементы выбираются в одном запросе SQL, что я считаю хорошим. Затем кажется, что выполняется запрос SELECT COUNT (*), если состояние найдено, то это состояние выбирается с помощью другого запроса SQL, это происходит для каждого элемента.
Предположение, что есть намного лучший способ сделать это, когда у меня есть несколько сотен элементов, количество выполняемых SQL-запросов огромно! Если у кого-нибудь есть какие-либо советы о том, как они поступят по этому поводу, мне было бы интересно услышать.
Спасибо.