2013-08-30 12 views
5

Ho 3 modelli. Rom::Favorite, Rom::Card, User. Sto avendo un problema creando la User has_many rom_cards through rom_favoritesRails: has_many attraverso non si restituisce correttamente con i modelli di namespace

qui sono le mie parti rilevanti dei miei modelli

Rom :: carte

class Rom::Card < ActiveRecord::Base 
    has_many :rom_favorites, class_name: "Rom::Favorite", foreign_key: "rom_card_id", dependent: :destroy 

    self.table_name = "rom_cards" 

end 

utente

class User < ActiveRecord::Base 
    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :role 

    has_many :rom_favorites, class_name: "Rom::Favorite", dependent: :destroy 
    has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites, class_name: "Rom::Favorite" 

end 

Rom: : Preferito

class Rom::Favorite < ActiveRecord::Base 
     attr_accessible :rom_card_id, :user_id 

     belongs_to :user 
     belongs_to :rom_card, class_name: "Rom::Card" 

     validates :user, presence: true 
     validates :rom_card, presence: true 
     validates :rom_card_id, :uniqueness => {:scope => :user_id} 

     self.table_name = "rom_favorites" 

    end 

Tutti i metodi di utilità che vengono con le associazioni lavorano tranne

a = User.find(1) 
a.rom_cards 

La chiamata a.rom_cards restituisce un array vuoto e sembra per eseguire la query SQL

SELECT "rom_favorites".* FROM "rom_favorites" INNER JOIN "rom_favorites" "rom_favorites_rom_cards_join" ON "rom_favorites"."id" = "rom_favorites_rom_cards_join"."rom_card_id" WHERE "rom_favorites_rom_cards_join"."user_id" = 1 

Io sono non forte in SQL, ma penso che questo sembra corretto.

So che a.rom_cards deve restituire 2 carte perché a.rom_favorites restituisce 2 preferiti e in quei preferiti sono card_id che esistono.

La chiamata che dovrebbe consentire rom_cards è il seguente

has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites, class_name: "Rom::Favorite" 

mi sento come il problema ha a che fare con il fatto che si sta cercando di trovare le schede utenti attraverso favoriti ed è alla ricerca di card_id (perché ho specificato la classe Rom :: Card) anziché rom_card_id. Ma potrei sbagliarmi, non esattamente sicuro.

risposta

13

Si sta duplicando la chiave class_name nell'hash dell'associazione. Non è necessario scrivere class_name: "Rom::Favorite" perché utilizzando through: :rom_favorites utilizzerà le opzioni di configurazione di has_many :rom_favorites.

Prova con:

has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites 
+0

grazie. ha funzionato perfettamente! – user2158382

+0

Qualche idea quando la classe through è in un namespace ??. Ad esempio: 'has_many: rom_cards, class_name:" Rom :: Card ", attraverso:: namespaced_rom_favorites'. – CristianOrellanaBak

Problemi correlati