【问题标题】:referencing attributes in models with belongs_to relationships through a nested namespace通过嵌套命名空间引用具有 belongs_to 关系的模型中的属性
【发布时间】:2011-01-04 18:35:42
【问题描述】:

好的,所以我以为我了解关系规范在 Rails 中的工作原理,但我已经为此苦苦挣扎了一天。

在某些情况下,我有两个模型 Cars & Model Names(例如 Impala、Charger 等),其中 Cars 是模型名称的实例,而模型名称实际上只不过是模型名称和其他模型级别的查找表属性。模型名称控制器嵌套在 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 方式吗?

提前致谢。

斯科特

【问题讨论】:

  • 我无法发表评论...所以这实际上是我没有假装回答...但是对于我所看到的,您的@car 不应该调用“admin_model_name”...单数吗? .
  • 是的,你是对的。我尝试了多种变体,并从“让我们看看这是否有效”之一中粘贴了代码。像 这样的单数我得到未初始化的常量 Car::AdminModelName

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


【解决方案1】:

你试过了吗:

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    你试过了吗

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2021-08-12
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多