2012-02-03 25 views
7

Chạy đường ray 3.1.3 ...Liên kết lồng nhau, cách chuẩn bị biến cho chế độ xem, đường ray

Tôi sẽ sử dụng ví dụ đơn giản về các liên kết lồng nhau (không chắc chắn đây có phải là cụm từ chính xác) hay không. Về cơ bản tôi đang mô hình cơ sở dữ liệu - mỗi cơ sở dữ liệu có bảng riêng của mình và mỗi bảng có các cột riêng của mình:

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 

Câu hỏi của tôi là, nói rằng tôi muốn hiển thị bảng và cột của một cơ sở dữ liệu trong một cái nhìn, những gì sẽ là một cách tốt để nhóm dữ liệu này trước khi chuyển dữ liệu đến chế độ xem. Về cơ bản, bộ điều khiển và chế độ xem của tôi trông như thế nào?

tôi đã đi lên với những điều sau đây, nhưng tôi sẽ ngạc nhiên nếu không có một cách tốt hơn để làm điều này:

điều khiển của tôi:

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

Quan điểm của tôi:

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

tôi cũng chơi xung quanh với việc sử dụng này trong bộ điều khiển:

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

Tuy nhiên việc cố truy cập tên bảng và cột từ @database đã khiến tôi phát điên.


UPDATE:

Thông thường, tôi đã dành nhiều giờ cố gắng để con số này ra và ngay sau khi tôi gửi ở đây, tôi nghĩ rằng tôi nhận được nó. Cảm ơn vì đề xuất đã thích - điều này đã hiệu quả đối với tôi. Ngoài ra, nếu tôi sửa đổi phương pháp của riêng mình bằng cách sử dụng phương pháp đầu tiên! phương pháp nó hoạt động như sau:

Bộ điều khiển:

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

Xem:

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

Vui mừng tôi có thể giúp. Cảm ơn bạn đã chỉ ra việc sử dụng .first trên sol'n cuối cùng của bạn - Tôi cũng sẽ cập nhật giải pháp của mình. Không có nó, tham chiếu trong khung nhìn sẽ ném một lỗi phương thức không xác định khi khung nhìn cố gắng truy cập (các) liên kết. Chúc mừng! – miked

Trả lời

2

Trừ khi tôi là thiếu một cái gì đó, điều này thực sự trông ổn với tôi, mặc dù bạn don' t cần @tables và @columns trong bộ điều khiển trừ khi bạn đang thực sự sử dụng chúng cho một cái gì đó trong xem.

điều khiển:

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 

xem:

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 %> 
Các vấn đề liên quan