我有3个模型。 Rom::FavoriteRom::CardUser。我在创建User has_many rom_cards through rom_favorites时遇到问题

这是我模型的相关部分

Rom::Card

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

Rom::收藏夹
   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。但是我可能是错的,不确定。

最佳答案

您正在复制关联哈希中的 key class_name。无需编写class_name: "Rom::Favorite",因为通过使用through: :rom_favorites,它将使用has_many :rom_favorites的配置选项。

尝试:

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

关于ruby-on-rails - Rails : has_many through not returning correctly with namespaced models,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18539202/

10-11 10:23