运行Rails 3.1.3 ...
我将使用一个嵌套关联的简单示例(不确定这是否是正确的术语)。基本上我是在建模数据库 - 每个数据库都有自己的表,每个表都有自己的列:
class Database < ActiveRecord::Base
has_many :tables
end
class Table < ActiveRecord::Base
belongs_to :database
has_many :columns
end
class Column < ActiveRecord::Base
belongs_to :table
end
我的问题是,我想在视图中显示数据库的表和列,在将这些数据传递给视图之前捆绑这些数据的好方法。基本上,我的控制器和视图会是什么样的?
我想出了以下内容,但如果没有更好的方法,我会感到惊讶:
我的控制器:
class DatabasesController < ApplicationController
def show
@database = Database.find_by_id(params[:id])
@tables = @database.tables
@columns = @database.tables.columns
end
end
我的观点:
Database: <%= @database.database_name %><br />
<% @tables.each do |table| %>
Table: <%= table.table_name %><br />
<% table.columns.each do |column| %>
Column: <%= column.column_name %><br />
<% end %>
<% end %>
我也在控制器中使用它:
@database = Database.where(:id => params[:id]).includes(:tables => [:columns])
然而,试图从@database访问表名和列名让我很生气。
更新
通常情况下,我花了很多时间试图解决这个问题,我发布后不久,我想我明白了。感谢miked的建议 - 这对我有用。另外,如果我使用第一个修改我自己的方法!方法如下:
控制器:
def show
@database = Database.where(:id => params[:id]).includes(:tables => [:columns]).first!
end
查看:
Database: <%= @database.database_name %><br />
<% @database.tables.each do |table| %>
Table: <%= table.table_name %><br />
<% table.columns.each do |column| %>
Column: <%= column.column_name %><br />
<% end %>
<% end %>
答案 0 :(得分:2)
除非我遗漏了一些东西,否则这对我来说看起来没问题,虽然你不需要控制器中的@tables和@columns,除非你真的在视图中使用它们。
控制器:
class DatabasesController < ApplicationController
def show
@database = Database.find(params[:id], :include=>{:tables => [:columns]}) #eager load
#or: @database = Database.where(:id => params[:id]).includes(:tables => [:columns]).first #eager load
#or: @database = Database.find(params[:id]) #queries will be executed in the view
end
end
视图:
Database: <%= @database.database_name %><br />
<% @database.tables.each do |table| %>
Table: <%= table.table_name %><br />
<% table.columns.each do |column| %>
Column: <%= column.column_name %><br />
<% end %>
<% end %>