Rails:has_many通过命名空间模型无法正确返回
我有3个型号。 Rom::Favorite
, Rom::Card
, User
。 我在User has_many rom_cards through rom_favorites
创建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
罗::collections
class Rom::Favorite {: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个collections夹,而那些collections夹中存在card_id。
应该允许rom_cards
的调用如下
has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites, class_name: "Rom::Favorite"
我觉得这个问题与它试图通过collections夹找到用户卡的事实有关,它正在寻找card_id(因为我指定了类Rom :: Card)而不是rom_card_id。 但我可能错了,不完全确定。
您正在复制关联哈希中的密钥class_name
。 没有必要编写class_name: "Rom::Favorite"
因为通过使用class_name: "Rom::Favorite"
through: :rom_favorites
它将使用has_many :rom_favorites
的配置选项。
试试:
has_many :rom_cards, class_name: "Rom::Card", through: :rom_favorites