2011-01-04 22 views
5

Ok, więc pomyślałem, że rozumiem, jak działają specyfikacje relacji w szynach, ale walczę z tym przez jeden dzień.odwoływanie się do atrybutów w modelach z relacjami belongs_to poprzez zagnieżdżoną przestrzeń nazw

Jakiś kontekst, mam dwa modele samochodów & Nazwy modeli (np. Impala, ładowarka, itp.), Gdzie samochody są instancjami nazw modeli, a nazwy modeli naprawdę są niczym więcej niż tabelą odnośników nazw modeli i niektórych innych modeli atrybuty poziomu. Kontroler nazwy modelu jest zagnieżdżony w przestrzeni nazw administratora, ponieważ tylko administratorzy mogą używać nazw modeli CRUD. Użytkownicy końcowi mogą dodawać wystąpienia samochodów do modelu Cars.

Więc w routes.rb mam:

resources :cars 

    namespace :admin do resources :model_names end 

Model są określone jako:

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

migracje są:

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 

Administrator CRUD z MODELNAME wszystko działa świetnie. Problem dotyczy widoków samochodów. Myślę, że powinno być odniesienie do konkretnej nazwy modeli samochodów takich jak:

<%= @car.admin_model_names.Model => 

Ale pojawia się błąd:

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

Próbowałem attr_accessible modelu ModelNames ale bezskutecznie. Dane bazowe są poprawnie przywoływane. Mam również relację HABTMT między samochodami & Użytkownicy i że wszystko działało dobrze, odwołując się nawzajem atrybuty z różnych widoków jednostek. Ale nie udało się tego uruchomić. Czy to z powodu zagnieżdżonego dziedziczenia sterowania zasobami?

Jedyną metodą odsyłania Okazało się, że działa to:

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

Ale to naprawdę wydaje się być zbyt dużo kodu (i kosztem znaleźć), aby dostać się do tego atrybutu. Czy istnieje sposób Rails?

Z góry dziękuję.

Scott

+0

Nie mogę skomentować ... więc to właściwie ja nie udaje mi się znaleźć odpowiedzi ... ale dla tego, co widzę, nie powinno się oznaczać twojego @car wywołania "nazwa_modelu_administratora" ... w liczbie pojedynczej? – Daniel

+0

Tak, masz rację. Próbowałem wielu wariantów i wkleiłem w kodzie z jednego z "well lets see if works". Z nim w liczbie pojedynczej, jak <% = @ car.admin_model_name.Model%> otrzymuję niezainicjowaną stałą Car :: AdminModelName – Scott

Odpowiedz

2

Próbowałeś

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

iw razie potrzeby dodać: foreign_key => '' i dodać tę kolumnę do tabeli samochodów.

9

Czy próbowałeś:

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

jak stwierdzono w

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

sekcji 3.4?

może być konieczne ustawienie atrybutu

:foreign_key => "admin_model_name_id"
w celu określenia modelu referencyjnego.

Mam nadzieję, że to pomaga.