9

好的,所以我以为我了解关系规范在 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的方式吗?

提前致谢。

斯科特

4

2 回答 2

14

你有没有尝试过:

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"
属性来指定引用模型。

希望能帮助到你。

于 2011-12-19T05:22:12.083 回答
4

你试过了吗

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

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

于 2011-10-02T19:36:48.190 回答