Rails:has_many通过没有正确返回命名空间模型

use*_*382 6 ruby ruby-on-rails associations ruby-on-rails-3

我有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
Run Code Online (Sandbox Code Playgroud)

用户

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
Run Code Online (Sandbox Code Playgroud)

罗::收藏

   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
Run Code Online (Sandbox Code Playgroud)

所有与协会一起使用的实用方法除外

a = User.find(1)
a.rom_cards
Run Code Online (Sandbox Code Playgroud)

该调用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
Run Code Online (Sandbox Code Playgroud)

我在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"
Run Code Online (Sandbox Code Playgroud)

我觉得这个问题与它试图通过收藏夹找到用户卡这一事实有关,它正在寻找card_id(因为我指定了类Rom :: Card)而不是rom_card_id.但我可能是错的,不完全确定.

akh*_*bis 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
Run Code Online (Sandbox Code Playgroud)