2011-01-04 2 views
5

Ok, quindi ho pensato di capire come funzionano le specifiche della relazione in rotaie, ma ho lottato con questo per un giorno.riferimento agli attributi nei modelli con appartiene alle relazioni attraverso uno spazio dei nomi nidificato

In alcuni contesti, ho due modelli Automobili & Nome modello (es. Impala, Caricabatterie, ecc.), Dove Auto è un'istanza di Nomi modello e Nomi modello in realtà non è altro che una tabella di ricerca di nomi modello e qualche altro modello attributi di livello. Il controller Nome modello è nidificato nello spazio dei nomi admin in quanto solo gli amministratori possono nomi di modelli CRUD. Gli utenti finali possono aggiungere istanze di automobili al modello Cars.

Così, in routes.rb ho:

resources :cars 

    namespace :admin do resources :model_names end 

del modello sono definiti come:

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

le migrazioni sono:

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 

L'amministratore CRUD di ModelName tutto funziona alla grande Il problema è nelle visualizzazioni dell'automobile. Penso che dovrei essere riferimento a un particolare nome di vetture modello come ad esempio:

<%= @car.admin_model_names.Model => 

Ma ottengo l'errore:

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

Ho provato l'attr_accessible sul modello ModelNames ma senza alcun risultato. I dati sottostanti sono referenziati correttamente. Ho anche una relazione HABTMT tra gli utenti di Automobili & e tutti hanno funzionato correttamente facendo riferimento agli attributi degli altri dalle diverse viste delle entità. Ma non sono stato in grado di farlo funzionare. È dovuto all'ereditarietà del controllo di gestione della risorsa nidificata &?

L'unico metodo di riferimento che ho trovato che funziona è:

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

Ma questo in realtà sembra essere troppo codice (e la spesa di un ritrovamento) per arrivare a tale attributo. Esiste un modo Rails?

Grazie in anticipo.

Scott

+0

Non posso commentare ... quindi in realtà non sto fingendo una risposta ... ma per quello che vedo non dovrebbe chiamare @ admin_model_name "in singolare? – Daniel

+0

Sì, hai ragione. Avevo provato più varianti e incollato nel codice da uno dei "ben vediamo se funziona". Con esso in singolare come <% = @ car.admin_model_name.Model%> ottengo costante non inizializzata Car :: AdminModelName – Scott

risposta

2

Hai provato

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

e, se necessario, aggiungere: foreign_key => '' e aggiungere questa colonna alla tabella auto.

9

Hai provato:

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

come indicato nel

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

sezione 3.4?

Potrebbe inoltre essere necessario impostare l'attributo

:foreign_key => "admin_model_name_id"
per specificare il modello di riferimento.

Spero che aiuti.