2012-02-03 20 views
7

Koşu Rails 3.1.3 ...İçiçe dernekler, görünümler için değişkenleri nasıl hazırlanacağını,

(bu doğru terim olup olmadığından emin değil) Ben iç içe derneklerin basit bir örnek kullanacağız raylar. Temelde ben veritabanlarını modelleme ediyorum - Her veritabanı kendi tabloları vardır ve her tablo, kendi sütun vardır:

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 

, bir görünümde bir veritabanının tablo ve sütunları görüntülemek istediğinizi varsayalım edilir Sorum, bir ne olurdu Bu verileri görüntülemeye geçmeden önce bu şekilde paketlemenin iyi bir yolu. Temel olarak, denetleyicim ve görünümü neye benziyordu?

Ben aşağıdaki ile geldim, ama bunu yapmanın çok daha iyi bir yolu yoktur eğer sürpriz olacaktır:

Benim denetleyicisi:

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

Benim görünümü:

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

Ben de denetleyicisi bu kullanarak etrafında oynadım:

@database = Database.where(:id => params[:id]).includes(:tables => [:columns]) 

Ancak, tabloya erişmeye çalışırken @database ve sütun adları beni yönlendirdi.


GÜNCELLEME:

Genellikle, ben bu anlamaya ve burada yazılan kısa bir süre sonra, ben anladım düşünmeye çalışıyorum saatlerce geçirdim. Öneri için teşekkürler - bu benim için çalıştı. Ayrıca, ilk adımı kullanarak kendi yöntemimi değiştirirsem! o kadar çalışır yöntem aşağıdaki gibidir:

Denetleyici:

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

Görünüm: Eğer don olsa

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

sevindim. Son sol'nuzda .first kullanımını işaretlediğiniz için teşekkür ederim. Çözümümü de güncelleyeceğim. Bu olmadan, görünümdeki ilişki, ilişkilendirmeyi ilişkilendirmeye çalıştığında tanımlanmamış bir yöntem hatası atar. Şerefe! – miked

cevap

2

şey kaçırıyorum sürece, bu aslında, bana normal görünüyor' Görünümde bir şey kullanmıyorsanız, denetleyicideki @tables ve @columns'a ihtiyacınız var.

kontrolör:

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 

görünüm:

yardım edebilirim
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 %>