好的,所以我以为我了解关系规范在 Rails 中是如何工作的,但我已经为此苦苦挣扎了一天。
在某些情况下,我有两个模型汽车和模型名称(例如 Impala、Charger 等),其中汽车是模型名称的实例,而模型名称实际上只不过是模型名称和一些其他模型级别属性的查找表。模型名称控制器嵌套在 admin 命名空间中,因为只有管理员可以 CRUD 模型名称。最终用户可以将汽车实例添加到 Cars 模型中。
所以,在 routes.rb 我有:
resources :cars
namespace :admin do resources :model_names end
模型定义为:
class Admin::ModelName < ActiveRecord::Base
end
class Car < ActiveRecord::Base
belongs_to :admin_model_name
end
迁移是:
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
ModelName 的管理员 CRUD 都很好用。问题出在汽车视图中。我想我应该像这样引用一个特定的汽车型号名称:
<%= @car.admin_model_names.Model =>
但我得到了错误:
undefined method `admin_model_names' for #<Car:0x000001040e2478>
我已经在 ModelNames 模型上尝试了 attr_accessible 但无济于事。正确引用了基础数据。我在汽车和用户之间也有 HABTMT 关系,并且从不同的实体视图中引用彼此的属性都可以正常工作。但一直无法让它发挥作用。是由于嵌套的资源和管理控制继承吗?
我发现唯一可行的参考方法是:
<%= Admin::ModelName.find(@car.admin_model_name_id).model %>
但这似乎真的是太多的代码(和查找费用)来获得该属性。有Rails的方式吗?
提前致谢。
斯科特