【问题标题】:Rails - Activerecord conditions with enumRails - 带有枚举的 Activerecord 条件
【发布时间】:2016-04-06 15:38:53
【问题描述】:

我有一个 Item 模型和一个 UserItem 模型。一个 Item 有很多 UserItem。

两种模型都使用 Enum:

enum status: [ :pending, :approved]

我需要查询 Item 以返回 user_items,其中 item.id != 1、item.status 已获批准且 user_items.status 处于待处理状态。我在使用正确的语法时遇到问题

Item.joins(:user_items).where( "items.id != ? and items.status = ? and user_items.status = ?", 1, ???, ???)

编写此查询的正确方法是什么?

【问题讨论】:

  • 您需要user_items.status 中的任何一个待处理的项目吗?或者所有的都在哪里?没有的物品怎么办?
  • 对不起,我有点不清楚,我会解决这个问题。我需要返回已批准父项但 id 不等于 1 的 user_items
  • 我的意思是有一个“已批准”Item 和两个UserItems,其中一个已批准,一个未批准 - 应该选择前者吗?
  • @vasfed 所以所有返回的user_items必须是pending,父item必须被批准并且父item id不能等于1

标签: ruby-on-rails activerecord enums


【解决方案1】:

由于您选择 UserItems,并假设您在 has_many 的另一侧有 belongs_to :item,因此关系查询看起来像

UserItem.pending.joins(:item).merge(Item.approved.where.not(id:1))

【讨论】:

  • 抱歉,我之前没有提到这一点,但是如果这是我想保留在我的 Item.rb 模型中的方法的一部分,该怎么办。它还能按照你的方式工作吗?
  • @user4584963 从技术上讲没关系。 PS。使用范围和Relation#merge 更新答案
【解决方案2】:

试试这个-

UserItem.joins("LEFT OUTER JOIN items.id = user_items.id").where("items.id != ? AND items.status = ? AND user_items.status = ?", 1, "approved","pending")

【讨论】:

    【解决方案3】:

    如果你不想使用范围

    Item.joins(:user_item).where("items.id != ? and items.status = ? and user_items.status = ?", 1, Item.statuses[:pending], UserItem.statuses[:approved ])

    但使用范围总是更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多