1

我正在尝试优化(限制)视图中的查询。我正在使用fields_for函数。我需要引用对象的各种属性,例如用于显示目的的用户名。但是,这是一个 rel 表,所以我需要加入我的 users 表。结果是 N 个子查询,fields_for中的每个字段都有 1 个。这很难解释,但我想如果我粘贴我的代码,你会明白我在问什么:

<%= form_for @election do |f| %>
  <%= f.fields_for :voters do |voter| %>
    <%= voter.hidden_field :id %>
    <%= voter.object.user.preferred_name %>              
  <% end %>
<% end %>

我有大约 10,000 个用户,而且很多时候每次选举都会包括所有 10,000 个用户。每次加载此视图时,就有 10,000 个子查询。我希望fields_for加入用户。这可能吗?

我想做类似的事情:

...
<%= f.fields_for :voters, :joins => :users do |voter| %>
  ...
<% end %>
...

但这当然行不通:(

4

3 回答 3

2

您只需确保选民关系始终与选举模型中的用户联系在一起。

class Election < ActiveRecord::Base
  has_many :voters, :include => :users
end

阅读有关关联的 Rails 文档以及在模型中声明关系时可以提供的额外选项。

http://railsapi.com/doc/rails-v3.0.1/classes/ActiveRecord/Associations/ClassMethods.html#M001055

于 2010-12-24T09:34:11.923 回答
0

所以,我不知道该怎么做,但我找到了解决方法。我在我的模型中覆盖了election.voters 以返回加入用户...

于 2010-12-24T02:59:00.720 回答
0

您还可以创建一个连接用户的命名范围

class Election < ActiveRecord::Base
  has_many :voters
  scope :with_voters, :include => :voters
  …
end

那么你可以使用类似的东西Election.with_voters.first

于 2010-12-24T11:11:12.433 回答