Ruby “后的活动记录关联”;。其中;查询

Ruby “后的活动记录关联”;。其中;查询,ruby,postgresql,ruby-on-rails-4,activerecord,Ruby,Postgresql,Ruby On Rails 4,Activerecord,我有三种型号:套牌、老虎机和卡片。我把它们放在一起就像这样。。。 牌组由多个插槽组成,每个插槽包含一张卡,任何一张卡都可以出现在多个不同的插槽中。 我根据“订单-订单行项目-产品”结构对其进行建模,希望这是有意义的 无论如何,牌组有一个整数字段,名为:deck_type,假设我想得到某一类型的所有牌组,然后查看它们的所有牌。我希望能够运行此查询,但我得到一个未定义方法“cards”的错误: Deck.where(:deck_type => 1).cards 得到所有类型1的牌组,然后吐出

我有三种型号:套牌、老虎机和卡片。我把它们放在一起就像这样。。。 牌组由多个插槽组成,每个插槽包含一张卡,任何一张卡都可以出现在多个不同的插槽中。 我根据“订单-订单行项目-产品”结构对其进行建模,希望这是有意义的

无论如何,牌组有一个整数字段,名为:deck_type,假设我想得到某一类型的所有牌组,然后查看它们的所有牌。我希望能够运行此查询,但我得到一个未定义方法“cards”的错误:

Deck.where(:deck_type => 1).cards
得到所有类型1的牌组,然后吐出他们的牌。我建立了一个“牌组通过插槽有许多牌”的关联,当我在一个牌组上调用“.cards”时,返回这些牌就可以了

我觉得这应该是一个非常基本的问题——我遗漏了什么


提前感谢您提供的任何见解。

该方法仅适用于一副牌。因此,以下措施应该有效:

Deck.where(deck_type: 1).first.cards
第一个
将获取一个甲板

如果您想要属于类型为1的牌组的牌,那么您有几个选项:

Deck.where(deck_type: 1).map(&:cards).flatten.uniq
这将在每个找到的牌组上应用
方法,然后获得所有卡。展平将使结果成为1D数组,然后uniq将确保不存在重复项(如果有)

但以下可能更快:

deck_ids = Deck.where(deck_type: 1).pluck(:id)
Card.where(deck_id: deck_ids)
我认为可以安全地假设您的卡模型具有deck_id属性。从上面,您将只获取在deck_id变量中具有deck_id的卡

不过,更好的是,它将是一个单一的数据库查询。假设您具有正确的关联设置,您可以执行以下操作:

# replace 'decks' with Deck.table_name if necessary
Card.joins(:deck).where(decks: {deck_type: 1})

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

方法
卡片
仅适用于一副牌。因此,以下措施应该有效:

Deck.where(deck_type: 1).first.cards
第一个
将获取一个甲板

如果您想要属于类型为1的牌组的牌,那么您有几个选项:

Deck.where(deck_type: 1).map(&:cards).flatten.uniq
这将在每个找到的牌组上应用
方法,然后获得所有卡。展平将使结果成为1D数组,然后uniq将确保不存在重复项(如果有)

但以下可能更快:

deck_ids = Deck.where(deck_type: 1).pluck(:id)
Card.where(deck_id: deck_ids)
我认为可以安全地假设您的卡模型具有deck_id属性。从上面,您将只获取在deck_id变量中具有deck_id的卡

不过,更好的是,它将是一个单一的数据库查询。假设您具有正确的关联设置,您可以执行以下操作:

# replace 'decks' with Deck.table_name if necessary
Card.joins(:deck).where(decks: {deck_type: 1})

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

感谢您的快速回复和精彩信息-您提供的地图和平坦选项完美地返回了我正在寻找的卡片!我在卡片表上没有:deck_id字段,因为它们通过插槽表与卡片组相关-这有意义吗,或者我的模型不起作用了?甲板有许多卡和卡可以在许多甲板上,所以我想避免多对多关系,如果可能的话,把插槽表之间。考虑有一个甲板和卡之间的关系,以便我写的最后一个命令可以工作。它比map(&:cards)更快。flatte.uniqDeck模型-“有很多:卡片,:通过=>:插槽”。。。这让我可以通过牌组获得牌,但通过牌组返回牌组更具挑战性,因为我不能在牌模型上放置“属于:牌组,:通过=>:槽”(至少我不知道)。不过,我对这一点还是很陌生,所以学习.map的工作原理是非常棒的,它让我可以用一行代码来完成通常需要几行代码才能完成的事情!我很好奇。在你的老虎机模型中,你有“属于:牌组”,在你的卡片模型中,你有“有很多:老虎机”。是吗?是的,我和关系有点纠结,但我有用户、牌组、吃角子老虎机、牌和版本(最终我会有交易、对话,谁知道还有什么)。它是这样设置的-用户有许多卡片组,卡片组属于用户并且有许多插槽,插槽属于卡片组并且属于卡片,卡片组有许多插槽并且属于版本。这是一个魔术,我正在收集的东西,有大量的卡,我真的想避免一个多对多的关系,这是我的解决方案。感谢你的快速回复和精彩的信息-你提出的地图和平坦选项返回的卡我正在寻找完美!我在卡片表上没有:deck_id字段,因为它们通过插槽表与卡片组相关-这有意义吗,或者我的模型不起作用了?甲板有许多卡和卡可以在许多甲板上,所以我想避免多对多关系,如果可能的话,把插槽表之间。考虑有一个甲板和卡之间的关系,以便我写的最后一个命令可以工作。它比map(&:cards)更快。flatte.uniqDeck模型-“有很多:卡片,:通过=>:插槽”。。。这让我可以通过牌组获得牌,但通过牌组返回牌组更具挑战性,因为我不能在牌模型上放置“属于:牌组,:通过=>:槽”(至少我不知道)。不过,我对这一点还是很陌生,所以学习.map的工作原理是非常棒的,它让我可以用一行代码来完成通常需要几行代码才能完成的事情!我很好奇。在你的老虎机模型中,你有“属于:牌组”,在你的卡片模型中,你有“有很多:老虎机”。是吗?是的,我和关系有点纠结,但我有用户、牌组、吃角子老虎机、牌和版本(最终我会有交易、对话,谁知道还有什么)。它是这样设置的-用户有许多卡片组,卡片组属于用户并且有许多插槽,插槽属于卡片组并且属于卡片,卡片组有许多插槽并且属于版本。这是一个神奇的聚会,我正在做的事情和数量的卡有我真的想避免一个多对多的关系,这是我的解决办法。