【问题标题】:Using OR query in rails devise omniauth for multiple users在rails中使用OR查询为多个用户设计omniauth
【发布时间】:2014-08-07 18:38:15
【问题描述】:

我希望能够使用 omniauth 登录用户并使用多个帐户进行设计。在我的用户模型中,我将 twitter 用户的 uid 设置为等于 uid 并且 provider = twitter.对于用户的 Facebook uid 将等于 uid2 和 provider2 = Facebook。

如果auth.slice = provider, uid,我目前使用此查询来登录用户或注册用户。

where(auth.slice(:provider, :uid)).first_or_create do |user|

但是现在我想运行类似于:

where(auth.slice(:provider, :uid || :provider2, :uid2 )).first_or_create do |user|

where auth.slice = :provider, :uid OR :provider2, :uid2

基本上我需要能够运行 OR 查询。

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql ruby-on-rails devise omniauth


    【解决方案1】:

    首先,auth.slice(:provider, :uid) 指的是来自omniauth 的身份验证哈希中的键,但provider2uid2 只是您数据库中的列,因此它们不能以任何方式在切片中使用,因为它们是't 键入身份验证哈希(尽管我意识到这只是您的说明/示例)。您需要提取哈希条目并分别与provideruid 列以及provider2uid2 列进行比较。此外,要执行 OR,您可以使用 SQL sn-ps 的老式方法:

    Users.where('(provider = :provider AND uid = :uid) OR (provider2 = :provider AND uid2 = :uid', {provider: auth[:provider], uid: auth[:uid]})
    

    或使用 AREL,因为沼泽标准 where 无法处理 OR。 AREL 自述文件非常易读 https://github.com/rails/arel -- 你可以这样做:

    prov = auth[:provider]
    uid = auth[:uid]
    users = Arel::Table.new(:users)
    users.where(users[:provider].eq(prov).and(users[:uid].eq(uid))).or(users[:provider2].eq(prov).and(users[:uid2].eq(uid)))).project(Arel.sql('*'))
    

    然而,我认为这两种方法的冗长突出表明,为每个提供者添加列集的方法会让事情变得有点痛苦,如果,例如,情况会变得更糟,您通过 google、yahoo 或其他方式添加登录,从而生成 provider3、uid3 和 provider4、uid4... 另一种方法是使用另一个模型/表来存储这些不同的身份,并与用户建立 has_many 关系。例如:

    class User < ActiveRecord::Base
      has_many :identities
      ...
    end
    
    class Identity < ActiveRecord::Base
      belongs_to :user
      ...
    end
    

    然后你可以使用简单的身份查找

    Identity.where(auth.slice(:provider, :uid))
    

    就像您现在一样,不必担心添加新的提供程序。它们只会在与相关用户相关的身份表中产生另一行。您可以与用户一起加入,或者您想要处理获取关联用户的任何方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多