2011-01-04 31 views
5

Ok, vì vậy tôi nghĩ rằng tôi hiểu cách các đặc tả mối quan hệ hoạt động trong đường ray nhưng tôi đã đấu tranh với điều này trong một ngày.tham chiếu thuộc tính trong các mô hình với các mối quan hệ thuộc về thông qua một không gian tên lồng nhau

Một số ngữ cảnh, tôi có hai kiểu Ôtô & Tên mẫu (ví dụ: Impala, Bộ sạc, vv), nơi Ô tô là trường hợp Tên mẫu và Tên mẫu thực sự không gì khác ngoài bảng tra cứu Tên mẫu và một số mẫu khác thuộc tính mức. Bộ điều khiển Model Name được lồng trong vùng tên quản trị vì chỉ có các quản trị viên mới có thể sử dụng tên mô hình CRUD. Người dùng cuối có thể thêm phiên bản ô tô vào mẫu Ô tô.

Vì vậy, trong routes.rb tôi có:

resources :cars 

    namespace :admin do resources :model_names end 

của mẫu được định nghĩa là:

class Admin::ModelName < ActiveRecord::Base 
end 
class Car < ActiveRecord::Base 
    belongs_to :admin_model_name 
end 

Các Migrations là:

class CreateCars < ActiveRecord::Migration 
    def self.up 
    create_table :cars do |t| 
     t.string :chassis_number 
     t.string :description 
     t.references :admin_model_name 
     t.timestamps 
    end 
end 

class CreateAdminModelNames < ActiveRecord::Migration 
    def self.up 
    create_table :admin_model_names do |t| 
     t.string :model 
     t.integer :sort_index 
     #...additional attributes removed 
     t.timestamps 
    end 

Các admin CRUD của ModelName tất cả làm việc tuyệt vời. Vấn đề ở chế độ xem Ô tô. Tôi nghĩ rằng tôi nên tham khảo một tên mô hình chiếc xe cụ thể như ví dụ:

<%= @car.admin_model_names.Model => 

Nhưng tôi nhận được lỗi:

undefined method `admin_model_names' for #<Car:0x000001040e2478> 

Tôi đã thử các attr_accessible trên mô hình ModelNames nhưng vô ích. Dữ liệu cơ bản được tham chiếu chính xác. Tôi cũng có mối quan hệ HABTMT giữa Ô tô & Người dùng và tất cả đều làm việc tốt khi tham chiếu từng thuộc tính khác từ các chế độ xem đối tượng khác nhau. Nhưng không thể làm được điều này. Có phải do tài nguyên lồng nhau & quyền kiểm soát quản trị viên không?

Phương pháp tham khảo duy nhất tôi thấy rằng làm việc là:

<%= Admin::ModelName.find(@car.admin_model_name_id).model %> 

Nhưng điều này thực sự có vẻ là quá nhiều mã (và chi phí của một phát hiện) để có được thuộc tính đó. Có một cách Rails?

Xin cảm ơn trước.

Scott

+0

Tôi không thể nhận xét ... vì vậy đây thực sự là tôi không giả vờ trả lời ... nhưng đối với những gì tôi thấy không nên gọi @car "admin_model_name" ... ở dạng số ít? – Daniel

+0

Có, bạn là chính xác. Tôi đã thử nhiều biến thể và dán trong mã từ một trong những 'cũng cho phép xem nếu điều này hoạt động'. Với nó trong số ít như <% = @ car.admin_model_name.Model%> Tôi nhận được uninitialized xe liên tục :: AdminModelName – Scott

Trả lời

2

Bạn có thử

class Car < ActiveRecord::Base 
    belongs_to :admin_model_name, :class_name => 'Admin::ModelName' 
end 

và nếu add cần thiết: foreign_key => '' và thêm cột này vào bảng chiếc xe của bạn.

9

Các bạn đã thử:

class Car < ActiveRecord::Base 
    belongs_to :admin_model_name, :class_name => "Admin::ModelName" 
end 

như đã nêu trong

http://guides.rubyonrails.org/association_basics.html

phần 3.4?

bạn cũng có thể cần đặt thuộc tính

:foreign_key => "admin_model_name_id"
để chỉ định mô hình tham chiếu.

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan