2013-08-30 36 views
5

Mam 3 modele. Rom::Favorite, Rom::Card, User. Mam problem tworzenia User has_many rom_cards through rom_favoritesSzyny: has_many przez nie zwracanie poprawnie z modelami z podziałem na nazwy

Oto moje odpowiednie części moich modeli

Rz :: karciane

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 

użytkownika

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: : Ulubiony

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 

Wszystkie metody użytkowych, które wraz ze stowarzyszeniami pracować z wyjątkiem

a = User.find(1) 
a.rom_cards 

wywołanie a.rom_cards zwraca pustą tablicę i wydaje się uruchomić tego zapytania 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 

Jestem nie jest silny w SQL, ale wydaje mi się, że to się zgadza.

Wiem, że a.rom_cards powinien zwrócić 2 karty, ponieważ a.rom_favorites zwraca 2 ulubione, aw tych ulubionych znajdują się numery kart, które istnieją.

połączenie, które powinny umożliwić rom_cards jest następujący

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

Czuję kwestii ma coś wspólnego z faktem, że stara się znaleźć karty użytkowników poprzez ulubionych i szuka card_id (ponieważ podałem klasę Rom :: Card) zamiast rom_card_id. Ale mógłbym się mylić, nie do końca pewny.

Odpowiedz

13

Powielacie klucz class_name w asocjacji asocjacyjnej. Nie ma potrzeby pisania class_name: "Rom::Favorite", ponieważ za pomocą through: :rom_favorites będzie używać opcji konfiguracyjnych has_many :rom_favorites.

Spróbuj z:

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

dziękuję. działało idealnie! – user2158382

+0

Jakiś pomysł, kiedy klasa przelotowa znajduje się w przestrzeni nazw ?. Na przykład: 'has_many: rom_cards, class_name:" Rom :: Card ", przez:: namespaced_rom_favorites'. – CristianOrellanaBak