Ruby on rails 如何组合两个activerecord关系

Ruby on rails 如何组合两个activerecord关系,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我有模型用户,用户有列提供程序 提供商可以是谷歌、facebook或nil 我想创建一个scope,它将输出所有用户,除了在某段时间内使用谷歌或更老提供商的用户 我试着用两个范围来做这件事: 范围:未经谷歌授权,->{whereprovider:[nil,'facebook']} 范围:最新的谷歌,->{whereprovider:'google'。wherecreated_在{whereprovider=?并在或provider!=?,'google',Time.now,'google'}我们

我有模型用户,用户有列提供程序

提供商可以是谷歌、facebook或nil

我想创建一个scope,它将输出所有用户,除了在某段时间内使用谷歌或更老提供商的用户

我试着用两个范围来做这件事:

范围:未经谷歌授权,->{whereprovider:[nil,'facebook']} 范围:最新的谷歌,->{whereprovider:'google'。wherecreated_在<?,Time.now} ... users=User.not\u谷歌\u授权 用户ActiveRecord::QueryMethodor直到rails 5才存在

另外,当前稳定的ruby版本是3.0.0,这意味着您不能使用3.3.7,因为它还不存在,也可能永远不存在

合并将结合使用和交集

因此,您最好使用原始SQL where或Arel,如:

这将导致:

SELECT 
  "users".*
FROM 
  "users" 
WHERE 
  ("users"."provider" IS NULL OR "users"."provider" = 'facebook')
   OR ( "users"."provider" = 'google' AND "users"."created_at" < [SOME TIME]
ActiveRecord::QueryMethodor在rails 5之前不存在

另外,当前稳定的ruby版本是3.0.0,这意味着您不能使用3.3.7,因为它还不存在,也可能永远不存在

合并将结合使用和交集

因此,您最好使用原始SQL where或Arel,如:

这将导致:

SELECT 
  "users".*
FROM 
  "users" 
WHERE 
  ("users"."provider" IS NULL OR "users"."provider" = 'facebook')
   OR ( "users"."provider" = 'google' AND "users"."created_at" < [SOME TIME]

我们可以这样在单个范围内进行纠正:


作用域:未经授权,>{whereprovider=?并在<>或provider!=?,'google',Time.now,'google'}

我们可以通过以下方式在单个作用域中更正:


范围:未授权,>{whereprovider=?并在<>或provider!=?,'google',Time.now,'google'}

一种方法是这样做,不是超级优化,而是完成任务

not_google_auth_ids=User.not_google_authorized.ids 最新\u id=User.newst\u google.id ids=非谷歌认证ID+最新ID users=User.whereid:ids
一种方法是这样做,不是超级优化,而是完成任务

not_google_auth_ids=User.not_google_authorized.ids 最新\u id=User.newst\u google.id ids=非谷歌认证ID+最新ID users=User.whereid:ids
您可以尝试在where中组合查询。User.whereprovider IN或provider=?并在>?,[nil,'facebook'],'google',Time创建了_。现在这只是一个粗略的草稿,但希望能有所帮助:DYou可以尝试在where中组合查询。User.whereprovider IN或provider=?并在>?,[nil,'facebook'],'google',Time创建了_。现在这只是一个粗略的草稿,但希望能有所帮助:D!=在这里不起作用,因为它不会显示空值。NULL不可比较,因此它既不等于google也不等于google NULL甚至不等于NULL!=在这里不起作用,因为它不会显示空值。NULL是不可比较的,所以它既不等于google也不等于google NULL甚至不等于NULL