嵌套关联,如何为视图,rails准备变量

时间:2012-02-03 13:55:41

标签: ruby-on-rails nested associations

运行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 %>

1 个答案:

答案 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 %>