积极记录协会" .where"询问

时间:2014-12-22 00:01:12

标签: ruby postgresql ruby-on-rails-4 activerecord

我有三种型号:甲板,插槽和卡片。我把它们放在一起...... 甲板由许多插槽组成,每个插槽包含一个卡,任何一个卡都可以显示在许多不同的插槽中。 我在“订单 - 订单行项目 - 产品”结构之后对其进行了建模,希望这是有道理的。

无论如何,Decks有一个名为:deck_type的整数字段,并且假设我想获得某种类型的所有牌组,然后看到他们所有的牌。我期望能够运行此查询但我得到一个未定义方法'卡'的错误:

Deck.where(:deck_type => 1).cards

要获得1型的所有套牌,然后吐出他们的牌。我有一个协会,“甲板有很多卡通过插槽”,当我在一个套牌上叫“.cards”时,可以正常退回卡片。

我觉得这应该是一个非常基本的查询 - 我错过了什么?

提前感谢任何见解。

1 个答案:

答案 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})

我希望最后一个是不言自明的。