Запрос ассоциации Rails - PullRequest
0 голосов
/ 04 июня 2010

У меня проблемы с доступом к правильной информации в моей модели рельсов (что я считаю правильным). Схема для моих таблиц:

create_table :schools do |t|
    t.string :name
    t.timestamps
end  

create_table :variables do |t|
    t.string :name
    t.string :category
    t.timestamps
end

create_table :data do |t|
    t.string :entry
    t.decimal :rank, :scale => 3
    t.integer :school_id, :null => false
    t.integer :variable_id, :null => false
    t.timestamps
end

Модельные классы:

class Datum < ActiveRecord::Base
    belongs_to :school
    belongs_to :variable
end

class School < ActiveRecord::Base
    has_many :data
    has_many :variables, :through => :data
end

class Variable < ActiveRecord::Base
    has_many :data
    has_many :schools, :through => :data
end

вот моя школьная страница show.html.erb в настоящее время:

<h2> <%= @school.name %> </h2>

<table>
<% @school.variables.each  do |variable| %>
<tr><tr/>
<td><%= variable.name %></td>
<td><%= Datum.find(:first, :conditions => {:school_id => @school.id, :variable_id => variable.id}).entry %></td> 
<td><%= link_to 'Edit', edit_school_path(@school) %></td>
<td><%= link_to 'Back', schools_path %></td>
<% end %>
</table>  

Он делает то, что я хочу, но он подходит для многих запросов. Я предполагаю, что я должен делать энергичную загрузку, но на основе примеров, которые я нашел в Интернете, я не мог понять, как это сделать (я действительно новичок в рельсах). У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Попробуйте и посмотрите, получите ли вы ожидаемые результаты, а также уменьшенное количество запросов.

Datum.find(:first, 
           :conditions => {:school_id => @school.id, :variable_id => variable.id}, 
           :include => [:school, :variable])

Кроме того, принципы MVC диктуют, что вы не должны делать поиск по вашему мнению; вместо этого в методе контроллера (app / controllers / school_controller.rb, метод show) выполните

@data = Datum.find(....)

и в представлении:

<%= @data.entry %>

Таким образом, вы не загрязняете свой взгляд проблемами доступа к БД.

0 голосов
/ 04 июня 2010

Хорошо, вы выполняете запрос Datum.find внутри цикла. Rails будет делать это для каждого из элементов, возвращаемых @ school.variables

Операторы поиска действительно должны выполняться в контроллере. Установите нужные вам переменные с помощью одной или двух тщательно продуманных находок, используя готовую загрузку. Затем поместите HTML-код в каждый цикл в частичное (называемое что-то вроде '_variable') и назовите его в своем представлении так:

<% render :partial 'variable', :collection => @school.variables %>

Внутри партиала вы получаете локальную переменную, названную в честь имени партиала с данными текущего члена коллекции. Rails позаботится о цикле за вас.

Надеюсь, это поможет.

...