Я создаю сайт, где пользователи могут отслеживать свою коллекцию фигур для Dungeons & Dragons (www.ddmdb.com). Модели / отношения, включенные в эту функциональность, следующие:
Пользователь:
- ID
- логин (логин)
- куча других полей
Миниатюрный:
- ID
- имя
- число (# в наборе, не в счет)
- release_id (внешний ключ)
- куча других полей и внешних ключей
Форма собственности:
- id (действительно ли это нужно?)
- user_id
- miniature_id
- have_count
- избранное (логическое)
Соответствующие отношения, которые я установил, таковы:
Пользователь:
- has_many: владения
- has_many: миниатюры,: through =>: владения,: uniq => истина,: условия => "owners.have_count> 0"
- has_many: избранное,: through =>: владения,: источник =>: миниатюра,: uniq => истина,: условия => "владение. Фаворит = истина"
Миниатюрные
- has_many: владения
- has_many: владельцев,: через =>: владения,: источник =>: пользователь,: uniq => истина,: условия => "владение.have_count> 0"
Форма собственности:
- принадлежит_: пользователь
- принадлежит_в: миниатюре
У меня есть страница, на которой пользователь может просматривать и обновлять свою коллекцию, а также просматривать коллекции других пользователей. Он содержит список всех миниатюр на сайте и текстовое поле рядом с каждым, где пользователь может указать, сколько у них каждой миниатюры. Эта функция также существует в подсписках миниатюр (отфильтрованных по типу, выпуску, размеру, редкости и т. Д.)
Когда пользователь создает учетную запись, у него нет записей в праве собственности. Когда они используют страницу коллекции или подсписок миниатюр для обновления своей коллекции, я создаю записи в таблице владения только для миниатюр на странице отправки. Поэтому, если это полный список Коллекции, я обновляю все мини (даже если счет равен 0) или если это подсписок, я обновляю только эти миниатюры. Так что в любое время конкретного пользователя я могу иметь:
- нет записей в собственности
- записи для некоторых миниатюр
- записи для всех миниатюр.
Проблема, с которой я столкнулся, заключается в том, что я не знаю, как запросить базу данных с помощью LEFT JOIN, используя «метод Rails», так что, если у пользователя нет записи для миниатюры в Ownerships, по умолчанию have_count = 0. В настоящее время я запрашиваю каждую комбинацию user_id / miniature_id в отдельности, поскольку перебираю все миниатюры, и это, очевидно, действительно неэффективно.
Вид:
<% for miniature in @miniatures %>
<td><%= link_to miniature.name, miniature %></td>
<td><%= text_field_tag "counts[#{miniature.id}]", get_user_miniature_count(current_user, miniature), :size => 2 %></td>
<% end %>
Помощник:
def get_user_miniature_count(user, miniature)
ownerships = user.ownerships
ownership = user.ownerships.find_by_miniature_id(miniature.id)
if ownership.nil?
return 0
else
return ownership.have_count
end
end
Альтернативным решением было бы создание записей для всех миниатюр, когда пользователь регистрируется, но тогда мне также нужно было бы добавить 0 have_count для всех пользователей, когда новая миниатюра добавляется в базу данных после регистрации. Кажется, что это может быть немного сложным, но, возможно, это правильный путь?
Есть ли способ выполнить объединение и указать значение по умолчанию для миниатюр, если в таблице владельцев для этого конкретного пользователя нет записей?