我正在建立一个站点,用户可以在其中跟踪他们的龙与地下城(www.ddmdb.com)的图形集合。此功能涉及的模型/关系如下:

用户:

  • id
  • 登录名(用户名)
  • 其他字段

  • 缩图:
  • id
  • 名称
  • 编号(集合中的#,未计数)
  • release_id(外键)
  • 其他字段和外键

  • 所有权:
  • id(真的需要吗?)
  • user_id
  • miniature_id
  • have_count
  • 最爱(布尔值)

  • 我建立的相关关系如下:

    用户:
  • has_many:所有权
  • has_many:miniatures,:through =>:ownerships,:uniq => true,:conditions =>“ownerships.have_count> 0”
  • has_many:favorites,:through =>:ownerships,:source =>:miniature,:uniq => true,:conditions =>“ownerships.favorite = true”

  • 缩图:
  • has_many:所有权
  • has_many:owners,:through =>:ownerships,:source =>:user,:uniq => true,:conditions =>“ownerships.have_count> 0”

  • 所有权:
  • 属于:用户
  • 属于:mini

  • 我有一个页面,用户可以在该页面上查看和更新​​他们的收藏集,也可以查看其他用户的收藏集。它包含站点上所有微型计算机的列表,以及每个微型计算机旁边的文本框,用户可以在其中输入他们拥有的每个微型计算机的数量。此功能还存在于微型子列表中(按类型,版本,大小,稀有性等过滤)。

    用户创建帐户时,所有权中没有任何条目。当他们使用收藏页面或缩图的子列表来更新其收藏时,我在所有权表中仅为提交页面上的缩图创建条目。因此,如果它是完整的收藏列表,则我将更新所有迷你模型(即使计数为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上一样(即没有数据库操作)。

    10-06 14:03