通过嵌套命名空间引用具有belongs_to关系的模型中的属性

时间:2011-01-04 18:35:43

标签: ruby-on-rails-3 belongs-to

好的,所以我认为我理解关系规范是如何在rails中运行的,但我现在一直在努力解决这个问题。

在某些情况下,我有两种型号的汽车&模型名称(例如Impala,Charger等),其中Cars是模型名称的实例,模型名称实际上只不过是模型名称和一些其他模型级别属性的查找表。模型名称控制器嵌套在管理员命名空间内,因为只有管理员可以使用CRUD模型名称。最终用户可以将汽车实例添加到汽车模型中。

所以,在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方式?

提前致谢。

斯科特

2 个答案:

答案 0 :(得分:11)

你试过了吗?

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

所述

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

第3.4节?

您可能还需要设置

:foreign_key => "admin_model_name_id"
属性以指定引用模型。

希望它有所帮助。

答案 1 :(得分:4)

你试过吗

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

如有必要,请添加:foreign_key =&gt; ''并将此列添加到您的汽车表中。