2011-01-04 3 views
5

Ok, also dachte ich, ich verstehe, wie die Beziehungsspezifikationen in Schienen funktionieren, aber ich kämpfe seit einem Tag damit.Referenzieren von Attributen in Modellen mit "objects_to" -Beziehungen durch einen verschachtelten Namespace

Einige Kontext, ich habe zwei Modelle Autos & Modellnamen (zB Impala, Ladegerät, etc), wo Autos Instanzen von Modellnamen sind, und Modellnamen ist wirklich nichts mehr als eine Nachschlagetabelle von Modellnamen und einige andere Modelle Level-Attribute. Der Modellname-Controller ist im Admin-Namespace verschachtelt, da nur Administratoren CRUD-Modellnamen verwenden können. Endbenutzer können dem Cars-Modell Instanzen von Autos hinzufügen. alle

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 

Der Admin CRUD von Modelname:

Also, in routes.rb ich habe:

resources :cars 

    namespace :admin do resources :model_names end 

des Modells sind wie folgt definiert:

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

Die Migrationen sind toll arbeiten. Das Problem ist in den Autoansichten. Ich denke, ich sollte ein bestimmtes Autos Modellnamen wie solche werden Referenzierung:

<%= @car.admin_model_names.Model => 

Aber ich bekomme die Fehlermeldung:

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

Ich habe versucht, auf dem ModelNames Modell der attr_accessible, aber ohne Erfolg. Die zugrunde liegenden Daten werden korrekt referenziert. Ich habe auch eine HABTMT-Beziehung zwischen Autos & Benutzer und das alles funktioniert gut Referenzierung der jeweils anderen Attribute aus den verschiedenen Entitäten Ansichten. Aber ich konnte das nicht zur Arbeit bringen. Liegt es an der verschachtelten Ressource & Admin Control Vererbung?

Die einzige Referenzierungsmethode Ich fand, das funktioniert ist:

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

Aber das scheint wirklich zu viel Code (und Kosten eines Fund) zu sein, um dieses Attribut zu erhalten. Gibt es einen Schienen-Weg?

Vielen Dank im Voraus.

Scott

+0

kann ich nicht kommentieren ... also das ist eigentlich ich nicht vorgeben zu einer Antwort ... aber für was ich sehe sollte nicht Ihr @car Anruf "admin_model_name" ... in der Einzahl? – Daniel

+0

Ja, Sie haben Recht. Ich hatte mehrere Varianten ausprobiert und den Code aus einem der 'naja mal sehen, ob das funktioniert' eingefügt. Mit ihr in Singular wie <% = @ car.admin_model_name.Modell%> bekomme ich die nicht initialisierte Konstante Car :: AdminModelName – Scott

Antwort

2

Haben Sie versucht,

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

und ggf. add: foreign_key => '' und diese Kolumne an Ihre Autos Tisch.

9

Haben Sie versucht:

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

wie in

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

Abschnitt 3.4 angegeben?

Sie müssen möglicherweise auch das

:foreign_key => "admin_model_name_id"
Attribut festlegen, um das referenzierende Modell anzugeben.

Ich hoffe, es hilft.

Verwandte Themen