我正在建立一个站点,用户可以在其中跟踪他们的龙与地下城(www.ddmdb.com)的图形集合。此功能涉及的模型/关系如下:
用户:
缩图:
所有权:
我建立的相关关系如下:
用户:
缩图:
所有权:
我有一个页面,用户可以在该页面上查看和更新他们的收藏集,也可以查看其他用户的收藏集。它包含站点上所有微型计算机的列表,以及每个微型计算机旁边的文本框,用户可以在其中输入他们拥有的每个微型计算机的数量。此功能还存在于微型子列表中(按类型,版本,大小,稀有性等过滤)。
用户创建帐户时,所有权中没有任何条目。当他们使用收藏页面或缩图的子列表来更新其收藏时,我在所有权表中仅为提交页面上的缩图创建条目。因此,如果它是完整的收藏列表,则我将更新所有迷你模型(即使计数为0),或者如果它是子列表,我也将仅更新那些微型模型。因此,在任何时候我可能都有一个特定的用户:
-没有所有权条目
-一些缩影的条目
-所有缩图的条目。
我遇到的问题是我不知道如何使用“Rails方法”使用LEFT JOIN查询数据库,因此,如果用户在Ownerships中没有缩微条目,则默认为has_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 %>
helper :
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。看起来可能有点复杂,但是也许这是正确的方法?
如果所有权表中没有该特定用户的条目,是否可以进行联接并提供缩微图的默认值?
最佳答案
我要说的第一件事是,用户模型应该拥有可以计算出用户拥有的给定缩图数量的代码,因为它看起来像是“业务逻辑”,而不是 View 格式。
我的建议是为您的User模型添加一个方法:
def owns(miniature_id)
o = ownerships.detect { |o| o.miniature_id == miniature_id }
(o && o.have_count) || 0
end
干编码,ymmv。
编辑:请注意,所有权一旦加载就由Rails缓存,并且检测不会像find is一样被ActiveRecord覆盖,因此,其行为与您期望的在Array上一样(即没有数据库操作)。