首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OR and exclusive限制的ActiveRecord select

使用OR and exclusive限制的ActiveRecord select
EN

Stack Overflow用户
提问于 2018-04-06 22:48:57
回答 4查看 384关注 0票数 3

我需要查询数据库并检索最近10个活动或拒绝的对象。我们使用以下代码:

代码语言:javascript
复制
User.where(status: [:active, :declined]).limit(10)

现在我们需要获取每个状态的最后10个(总共20个用户)

我尝试过以下几种方法:

代码语言:javascript
复制
User.where(status: :active).limit(10).or(User.where(status: : declined).limit(10))
# SELECT  "users".* FROM "users" WHERE ("users"."status" = $1 OR "users"."status" = $2) LIMIT $3

这与前面的查询执行相同的操作,并且仅返回10个混合状态的用户。

如何通过一次查询获取最近10个活跃用户和最近10个拒绝用户?

EN

回答 4

Stack Overflow用户

发布于 2018-04-06 23:12:05

我不确定SQL是否允许做你想做的事情。我要尝试的第一件事是使用子查询,如下所示:

代码语言:javascript
复制
class User < ApplicationRecord
  scope :active, -> { where status: :active }
  scope :declined, -> { where status: :declined }
  scope :last_active_or_declined, -> {
    where(id: active.limit(10).pluck(:id))
      .or(where(id: declined.limit(10).pluck(:id))
  }
end

然后你可以在别的地方做

代码语言:javascript
复制
User.last_active_or_declined()

这样做的目的是执行两个不同的子查询,分别询问每个用户组,然后获取propper组ids中的用户。我会说您甚至可以忘记pluck(:id)部分,因为ActiveRecord足够聪明,可以将适当的select子句添加到您的SQL中,但我不能百分之百确定,而且我手头没有任何可以尝试这一点的Rails项目。

票数 1
EN

Stack Overflow用户

发布于 2018-04-06 23:09:01

limit不是#or关系的允许值。如果检查Rails代码,则引发的错误来自here

代码语言:javascript
复制
def or!(other) # :nodoc:
  incompatible_values = structurally_incompatible_values_for_or(other)

  unless incompatible_values.empty?
    raise ArgumentError, "Relation passed to #or must be structurally compatible. Incompatible values: #{incompatible_values}"
  end
  # more code
end

您可以在代码here中进一步检查哪些方法受到了限制

代码语言:javascript
复制
STRUCTURAL_OR_METHODS = Relation::VALUE_METHODS - [:extending, :where, :having, :unscope, :references]
def structurally_incompatible_values_for_or(other)
  STRUCTURAL_OR_METHODS.reject do |method|
    get_value(method) == other.get_value(method)
  end
end

您可以在Relationhere中看到限制是受限制的:

代码语言:javascript
复制
SINGLE_VALUE_METHODS = [:limit, :offset, :lock, :readonly, :reordering,
                        :reverse_order, :distinct, :create_with, :skip_query_cache,
                        :skip_preloading]

因此,我担心您将不得不求助于原始SQL

票数 0
EN

Stack Overflow用户

发布于 2018-04-06 23:18:44

我不认为您可以使用单个查询来完成此操作,但您可以使用两个查询来完成此操作,获取记录it,然后使用这些记录it构建一个查询。

这并不理想,但由于您只是提取It,因此影响并不是很严重。

代码语言:javascript
复制
user_ids = User.where(status: :active).limit(10).pluck(:id) + User.where(status: :declined).limit(10).pluck(id)
users = User.where(id: user_ids)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49695447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档