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)
除非我遗漏了一些东西,否则这对我来说实际上看起来不错,尽管您不需要控制器中的 @tables 和 @columns 除非您确实在视图中使用它们。
\n\n控制器:
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n\n看法:
\n\nDatabase: <%= @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 %>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |