sql - 我怎样才能使这个 Ruby on Rails 页面更有效率?

标签 sql ruby-on-rails activerecord performance

我正在建立一个网站,用户可以在该网站上跟踪他们为《龙与地下城》收集的人物 (www.ddmdb.com)。此功能涉及的模型/关系如下:

用户:

  • 编号
  • 登录(用户名)
  • 一堆其他领域

微型:

  • 编号
  • 姓名
  • 个数(#在集合中,不算数)
  • release_id(外键)
  • 一堆其他字段和外键

所有权:

  • id(真的需要这个吗?)
  • 用户编号
  • miniature_id
  • 有_count
  • 最喜欢的( bool 值)

我建立的相关关系如下:

用户:

  • 拥有很多:所有权
  • 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 :owners, :through => :ownerships, :source => :user, :uniq => true, :conditions => "ownerships.have_count > 0"

所有权:

  • 属于:用户
  • 属于:微型

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

当用户创建帐户时,他们没有任何所有权条目。当他们使用收藏页面或微缩模型的子列表来更新他们的收藏时,我会在所有权表中仅为提交页面上的微缩模型创建条目。因此,如果它是完整的收藏列表,我会更新所有迷你图(即使计数为 0),或者如果它是子列表,我只会更新那些迷你图。所以在任何时候我可能有一个特定的用户: - 没有所有权条目 - 一些微缩模型的条目 - 所有微缩模型的条目。

我遇到的问题是我不知道如何使用“Rails 方法”通过 LEFT JOIN 查询数据库,因此如果用户在 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。这似乎有点复杂,但也许这是正确的方法?

在所有权表中没有该特定用户的条目的情况下,是否有一种方法可以进行连接并为缩图提供默认值?

最佳答案

我要说的第一件事是用户模型应该拥有计算用户拥有多少给定缩影的代码,因为它看起来像是“业务逻辑”而不是 View 格式。

我的建议是向您的用户模型添加一个方法:

def owns(miniature_id)
  o = ownerships.detect { |o| o.miniature_id == miniature_id }
  (o && o.have_count) || 0
end

干编码,ymmv。

编辑:请注意,所有权在加载后由 Rails 缓存,并且检测不会像 find 那样被 ActiveRecord 覆盖,因此它在数组上的行为与您期望的一样(即没有数据库操作)。

关于sql - 我怎样才能使这个 Ruby on Rails 页面更有效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/387850/

相关文章:

sql - 是否可以在脚本中自动强制 SQLCMD 模式?

java - 如何修复客户端首选项 [TLS12] 不接受服务器选择的协议(protocol)版本 TLS10

iphone - 核心数据: 3 table join?

ruby-on-rails - Metal 与 Rack 有何不同?

ruby-on-rails - 在 Ruby 中将小数转换为价格格式

ruby-on-rails-3 - 使用 `to_sql` 时如何在 AREL 中使用 `average()` ?

sql - 从 select 语句中的 SUM 返回前 5 个

ruby-on-rails - 如何在 Chrome 浏览器中查看在机器上的本地主机中运行的网站?

ruby-on-rails - Rails-build_association不适用于has_one和belongs_to关系

ruby-on-rails - 如何摆脱归因于 rails 关联的 n+1 查询?