ссылка на атрибуты в моделях со связями принадлежащим_вто через вложенное пространство имен - PullRequest
7 голосов
/ 04 января 2011

Хорошо, поэтому я подумал, что понял, как спецификации отношений работают в рельсах, но я боролся с этим уже целый день.

В некотором контексте у меня есть две модели Автомобили и названия моделей (например, Impala, Charger и т. Д.), Где автомобили являются экземплярами названий моделей, а имена моделей - это не что иное, как справочная таблица названий моделей и некоторые другие атрибуты уровня модели.Контроллер имени модели вложен в пространство имен администратора, так как только имена администраторов могут использовать имена моделей CRUD.Конечные пользователи могут добавлять экземпляры автомобилей в модель «Автомобили».

Итак, в rout.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

Администратор CRUD ModelName все отлично работает.Проблема в автомобилях просмотров.Я думаю, что я должен ссылаться на конкретное название модели автомобиля, например:

<%= @car.admin_model_names.Model =>

Но я получаю ошибку:

undefined method `admin_model_names' for #<Car:0x000001040e2478>

Я пробовал attr_accessible на модели ModelNames, но длябезрезультатно.На базовые данные ссылаются правильно.У меня также есть отношения HABTMT между Cars & Users, и все работало нормально, ссылаясь на атрибуты друг друга из разных представлений сущностей.Но не смог заставить это работать.Это связано с вложенным наследованием ресурсов и административного управления?

Единственный метод ссылок, который я нашел, который работает:

 <%= Admin::ModelName.find(@car.admin_model_name_id).model %>

Но это действительно слишком много кода (и за счетнайти), чтобы добраться до этого атрибута.Есть ли способ Rails?

Заранее спасибо.

Скотт

Ответы [ 2 ]

11 голосов
/ 19 декабря 2011

Вы пробовали:

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"
, чтобы указать модель ссылок.

Надеюсь, это поможет.

4 голосов
/ 02 октября 2011

Вы пробовали

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

и, если необходимо, добавьте: foreign_key => '' и добавьте этот столбец в таблицу машин.

...