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

Dav*_*avB 7 nested ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

我的问题是,我想在视图中显示数据库的表和列,在将这些数据传递给视图之前捆绑这些数据的好方法.基本上,我的控制器和视图会是什么样子?

我想出了以下内容,但如果没有更好的方法,我会感到惊讶:

我的控制器:

class DatabasesController < ApplicationController
  def show
    @database = Database.find_by_id(params[:id])
    @tables = @database.tables
    @columns = @database.tables.columns
  end
end
Run Code Online (Sandbox Code Playgroud)

我的看法:

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 %>
Run Code Online (Sandbox Code Playgroud)

我也玩过在控制器中使用它:

@database = Database.where(:id => params[:id]).includes(:tables => [:columns])
Run Code Online (Sandbox Code Playgroud)

但是,试图从@database访问表名和列名让我很生气.


更新:

通常情况下,我花了很多时间试图解决这个问题,我在这里发布后不久,我想我明白了.感谢miked的建议 - 这对我有用.另外,如果我使用第一个修改我自己的方法!方法的工作原理如下:

控制器:

def show
  @database = Database.where(:id => params[:id]).includes(:tables => [:columns]).first!
end
Run Code Online (Sandbox Code Playgroud)

视图:

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 %>
Run Code Online (Sandbox Code Playgroud)

mik*_*ked 2

除非我遗漏了一些东西,否则这对我来说实际上看起来不错,尽管您不需要控制器中的 @tables 和 @columns 除非您确实在视图中使用它们。

\n\n

控制器:

\n\n
class DatabasesController < ApplicationController\n\xc2\xa0 def show\n\xc2\xa0 \xc2\xa0 @database = Database.find(params[:id], :include=>{:tables => [:columns]}) #eager load\n\xc2\xa0 \xc2\xa0 #or: @database = Database.where(:id => params[:id]).includes(:tables => [:columns]).first #eager load\n    #or: @database = Database.find(params[:id]) #queries will be executed in the view\n\xc2\xa0 end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

看法:

\n\n
Database: <%= @database.database_name %><br />\n<% @database.tables.each do |table| %>\n\xc2\xa0 Table: <%= table.table_name %><br />\n\xc2\xa0 <% table.columns.each do |column| %>\n\xc2\xa0 \xc2\xa0 Column: <%= column.column_name %><br />\n\xc2\xa0 <% end %>\n<% end %>\n
Run Code Online (Sandbox Code Playgroud)\n