2011-01-04 12 views
5

Ok, entonces pensé que entendía cómo funcionan las especificaciones de relación en los rieles, pero he estado luchando con esto por un día.haciendo referencia a los atributos en modelos con relationships_to relaciones a través de un espacio de nombre anidado

Contexto, tengo dos modelos Cars & Nombres de modelos (por ejemplo, Impala, Charger, etc.), donde Cars son ejemplos de nombres de modelos, y Model Names realmente no es más que una tabla de búsqueda de nombres de modelos y algún otro modelo atributos de nivel. El controlador del nombre del modelo está anidado en el espacio de nombres del administrador, ya que solo los administradores pueden usar los nombres del modelo CRUD. Los usuarios finales pueden agregar instancias de autos al modelo de Cars.

Así, en routes.rb tengo:

resources :cars 

    namespace :admin do resources :model_names end 

se definen de la modelo como:

class Admin::ModelName < ActiveRecord::Base 
end 
class Car < ActiveRecord::Base 
    belongs_to :admin_model_name 
end 

Las migraciones son:

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 

El administrador de CRUD ModelName todo funciona bien El problema está en las vistas del auto. Creo que debería estar haciendo referencia a un nombre de coches modelo en particular, como por ejemplo:

<%= @car.admin_model_names.Model => 

Pero me sale el error:

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

he probado el attr_accessible en el modelo ModelNames pero fue en vano. Los datos subyacentes están referenciados correctamente. También tengo una relación HABTMT entre los usuarios de Cars & y todo funcionó bien haciendo referencia a los atributos de los demás desde las diferentes vistas de las entidades. Pero no he podido hacer que esto funcione. ¿Es debido al recurso anidado & admin control inheritance?

El único método de referencia que encontré que funciona es:

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

Pero esto en realidad parece ser demasiado código (y el costo de un hallazgo) para llegar a ese atributo. ¿Hay un camino de Rails?

Gracias de antemano.

de Scott

+0

No puedo comentar ... así que esto es en realidad yo no pretendo una respuesta ... pero por lo que veo, ¿tu llamada @car no debería llamar "admin_model_name" ... en singular? – Daniel

+0

Sí, estás en lo correcto. Probé varias variantes y pegué el código de uno de los 'bueno, veamos si esto funciona'. Con él en singular como <% = @ car.admin_model_name.Model%> obtengo constante no inicializada Car :: AdminModelName – Scott

Respuesta

2

¿Usted intentó

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

y si es necesario, añada: foreign_key => '' y añadir esta columna a la tabla coches.

9

Ha intentado:

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

como se indica en

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

sección 3.4?

es posible que también necesite establecer el atributo

:foreign_key => "admin_model_name_id"
para especificar el modelo de referencia.

Espero que ayude.

Cuestiones relacionadas