我无法访问我的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>
它做了我想要的,但它对很多查询都很有用。我假设我必须做急切的加载,但根据我在网上发现的例子,我无法弄清楚如何做到这一点(我真的很新的铁路)。有没有人有任何想法?
答案 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将为您处理循环。
我希望有所帮助。