2012-02-03 5 views
7

実行中の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からテーブルとカラム名にアクセスしようとすると、私は気が狂ってしまいました。


UPDATE:

一般的に、私はこのアウトを理解しようと多くの時間を費やしていると私はここに投稿した直後、私はそれを得ると思います。提案されたことをありがとう - これは私のために働いた。また、私が最初の方法を使って自分の方法を修正すれば!方法次のように動作します:

コントローラー:

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

私は助けることがうれしいです。あなたの最終ソルに.firstの使用を指摘してくれてありがとう - 私も私のソリューションを更新します。これがなければ、ビューがアソシエーションにアクセスしようとすると、ビュー内の参照は未定義のメソッドエラーをスローします。乾杯! – miked

答えて

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 %> 
関連する問題