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

Sco*_*ott 7 belongs-to ruby-on-rails-3

好的,所以我想我已经理解了关系规范如何在rails中工作但是我已经在这一天中苦苦挣扎了一天.

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

所以,在routes.rb我有:

  resources :cars

  namespace :admin do resources :model_names end
Run Code Online (Sandbox Code Playgroud)

模型定义为:

class Admin::ModelName < ActiveRecord::Base
end
class Car < ActiveRecord::Base
  belongs_to :admin_model_name
end
Run Code Online (Sandbox Code Playgroud)

迁移是:

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
Run Code Online (Sandbox Code Playgroud)

ModelName的管理员CRUD都很棒.问题出在汽车视图中.我想我应该引用一个特定的汽车模型名称,如:

<%= @car.admin_model_names.Model =>
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

undefined method `admin_model_names' for #<Car:0x000001040e2478>
Run Code Online (Sandbox Code Playgroud)

我在ModelNames模型上尝试过attr_accessible,但无济于事.正确引用了基础数据.我在汽车和用户之间也有HABTMT关系,所有这些关系都可以很好地引用来自不同实体视图的彼此属性.但是还没能让它发挥作用.是否由于嵌套资源和管理控制继承?

我发现唯一有效的参考方法是:

 <%= Admin::ModelName.find(@car.admin_model_name_id).model %>
Run Code Online (Sandbox Code Playgroud)

但这实际上似乎是太多的代码(以及查找费用)来获得该属性.是否有Rails方式?

提前致谢.

斯科特

小智 11

你有没有尝试过:

class Car < ActiveRecord::Base   
  belongs_to :admin_model_name, :class_name => "Admin::ModelName" 
end
Run Code Online (Sandbox Code Playgroud)

如中所述

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

第3.4节?

你可能还需要设置

:foreign_key => "admin_model_name_id"
用于指定引用模型的属性.

希望能帮助到你.


wrt*_*prt 5

你试过了吗

class Car < ActiveRecord::Base
  belongs_to :admin_model_name, :class_name => 'Admin::ModelName'
end
Run Code Online (Sandbox Code Playgroud)

如有必要,添加 :foreign_key => '' 并将此列添加到您的 cars 表中。