Rails关联查询

时间:2010-06-03 23:15:19

标签: ruby-on-rails associations

我无法访问我的rails模型中的正确信息(我认为这是正确的)我的表的架构是

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 个答案:

答案 0 :(得分:2)

试试这个,看看你是否得到了预期的结果,以及减少了查询次数。

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

此外,MVC原则规定你不应该在你的视图中进行查找;相反,在控制器的方法(app / controllers / school_controller.rb,方法展示)中

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

并在视图中:

<%= @data.entry %>

这样,您就不会因数据库访问问题而污染您的视图。

答案 1 :(得分:0)

你正在循环中进行你的Datum.find查询。对于@ school.variables

返回的每个元素,Rails都会这样做

查找语句应该在控制器中完成。使用预先加载,使用一个或两个精心构造的查找来设置您需要的变量。然后将每个循环中的HTML内容放入一个部分(名为'_variable'之类的东西)并在你的视图中调用它:

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

在partial中,你得到一个以partial的名字命名的局部变量,其中包含来自集合当前成员的数据。 Rails将为您处理循环。

我希望有所帮助。