我有三种型号:甲板,插槽和卡片。我把它们放在一起...... 甲板由许多插槽组成,每个插槽包含一个卡,任何一个卡都可以显示在许多不同的插槽中。 我在“订单 - 订单行项目 - 产品”结构之后对其进行了建模,希望这是有道理的。
无论如何,Decks有一个名为:deck_type的整数字段,并且假设我想获得某种类型的所有牌组,然后看到他们所有的牌。我期望能够运行此查询但我得到一个未定义方法'卡'的错误:
Deck.where(:deck_type => 1).cards
要获得1型的所有套牌,然后吐出他们的牌。我有一个协会,“甲板有很多卡通过插槽”,当我在一个套牌上叫“.cards”时,可以正常退回卡片。
我觉得这应该是一个非常基本的查询 - 我错过了什么?
提前感谢任何见解。
答案 0 :(得分:4)
方法cards
仅适用于一个套牌。所以以下内容应该有效:
Deck.where(deck_type: 1).first.cards
first
将获取1个套牌。
如果你想要卡片属于deck_type 1的套牌,那么你有几个选择:
Deck.where(deck_type: 1).map(&:cards).flatten.uniq
这将在每个找到的牌组上应用cards
方法,然后获得所有牌。 flatten会将结果变成一维数组,然后uniq将确保不存在重复项(如果有的话)。
但以下可能会更快:
deck_ids = Deck.where(deck_type: 1).pluck(:id)
Card.where(deck_id: deck_ids)
我认为您的卡片模型具有deck_id属性是安全的。从上面开始,您将只获取deck_ids变量中具有deck_id的那些卡片。
然而,更好的是以下内容,因为它将是单个数据库查询。假设您已获得正确的关联设置,您可以执行以下操作:
# replace 'decks' with Deck.table_name if necessary
Card.joins(:deck).where(decks: {deck_type: 1})
我希望最后一个是不言自明的。