我有3个型号。 Rom::Favorite
,Rom::Card
,User
。我在创建User has_many rom_cards through rom_favorites
以下是我模特的相关部分
罗::卡
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
用户
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
罗::收藏
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
除了
之外,协会附带的所有实用方法都有效a = User.find(1)
a.rom_cards
调用a.rom_cards
返回一个空数组,似乎运行此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
我在SQL方面不强,但我认为这似乎是正确的。
我知道a.rom_cards
应该返回2张牌,因为a.rom_favorites
会返回2个收藏夹,而那些收藏夹中存在的是card_id。
应允许rom_cards
的通话如下
has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites, class_name: "Rom::Favorite"
我觉得这个问题与它试图通过收藏夹找到用户卡的事实有关,它正在寻找card_id(因为我指定了类Rom :: Card)而不是rom_card_id。但我可能错了,不完全确定。
答案 0 :(得分:14)
您正在复制关联哈希中的密钥class_name
。无需编写class_name: "Rom::Favorite"
,因为使用through: :rom_favorites
它将使用has_many :rom_favorites
的配置选项。
尝试:
has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites