Rails 3 fields_for агрессивная загрузка? - PullRequest
1 голос
/ 24 декабря 2010

Я пытаюсь оптимизировать (ограничить) запросы в представлении.Я использую функцию fields_for .Мне нужно ссылаться на различные свойства объекта, такие как имя пользователя для отображения.Однако это таблица rel, поэтому мне нужно присоединиться к моей таблице пользователей.Результатом является N подзапросов, 1 для каждого поля в fields_for .Это сложно объяснить, но я думаю, что вы поймете, что я спрашиваю, если я вставлю свой код:

<%= 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 %>
...

Но это, конечно, не работает: (

Ответы [ 3 ]

2 голосов
/ 24 декабря 2010

Вы можете просто убедиться, что отношения избирателей всегда объединяются с пользователями в модели выборов.

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

0 голосов
/ 24 декабря 2010

Вы также можете создать именованную область, которая присоединится к пользователям

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

, тогда вы можете использовать что-то вроде Election.with_voters.first

0 голосов
/ 24 декабря 2010

Итак, я понятия не имею, как это сделать, но я нашел способ обойти это.В моей модели я переопределил настройкуlection.voters, чтобы вернуться к пользователям ...

...