簡體   English   中英

在Rails中使用OR查詢為多個用戶設計omniauth

[英]Using OR query in rails devise omniauth for multiple users

我希望能夠使用omniauth登錄用戶並設計多個帳戶。 在我的用戶模型中,我已將twitter用戶的uid設置為等於uid,並且provider = twitter。 對於用戶的Facebook uid,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查詢。

任何幫助都感激不盡。

首先, auth.slice(:provider, :uid)指的是鑰匙,從omn​​iauth但AUTH哈希provider2uid2在你的數據庫只列,因此他們不能在切片中,他們AREN任何方式使用't鍵入auth哈希(盡管我意識到那只是您的一個說明/示例)。 您需要提取哈希條目,並分別與provideruid列以及provider2uid2列進行比較。 另外,要執行“或”操作,您可以使用老式的SQL代碼段方法:

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

或使用AREL,作為沼澤標准where無法處理或無法。 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))

就像您現在所做的一樣,不必擔心添加新的提供程序。 它們只會在身份表中導致與相關用戶有關的另一行。 您可以與用戶一起加入,或者您想處理如何獲得關聯的用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM