使用 1 个值按两个不同的字段搜索
Search by two different fields using 1 value
在数据库中,我有 2 个不同的令牌用于不同的集成。如果指定了集成代码,我想识别用户。集成令牌是唯一的,但是每个用户记录恰好需要 2 个令牌。
最简单的方法是传递额外的参数,但是我必须与一些我无法修改的遗留应用程序集成。
到目前为止,我已经写了类似的东西,但我相信有更干净、更 "railsy" 的方法可以获得相同的结果。
你能帮帮我吗?
def user
target_user = nil
target_user = User.where.not(user_token_type1: nil)
.find_by(user_token_type1: params[:user_token])
target_user = User.where.not(user_token_type2: nil)
.find_by(user_token_type2: params[:user_token]) if target_user.blank?
target_user || user_not_found
end
if val = params[:user_token].presence
query = "user_token_type1 = :token OR user_token_type2 = :token"
User.where(query, {token: val}).last
end || user_not_found
我阅读了你的评论,如果你必须这样做,你也可以通过以下方式进行:
val = params[:token_val]
User.where.not(user_token_type1: nil).find_by(user_token_type1: val) || \
User.where.not(user_token_type2: nil).find_by(user_token_type2: val)
但这显然会导致两个查询,其中一个可以完美地完成工作。
你也可以这样做:
User.where("user_token_type1 = ? OR user_token_type2 = ?", params[:user_token], params[:user_token])
此外,删除 User.where.not(user_token_type1: nil)
。向您的模型添加约束,以便您可以信任您的数据,而不是添加该样板。
在数据库中,我有 2 个不同的令牌用于不同的集成。如果指定了集成代码,我想识别用户。集成令牌是唯一的,但是每个用户记录恰好需要 2 个令牌。
最简单的方法是传递额外的参数,但是我必须与一些我无法修改的遗留应用程序集成。
到目前为止,我已经写了类似的东西,但我相信有更干净、更 "railsy" 的方法可以获得相同的结果。 你能帮帮我吗?
def user
target_user = nil
target_user = User.where.not(user_token_type1: nil)
.find_by(user_token_type1: params[:user_token])
target_user = User.where.not(user_token_type2: nil)
.find_by(user_token_type2: params[:user_token]) if target_user.blank?
target_user || user_not_found
end
if val = params[:user_token].presence
query = "user_token_type1 = :token OR user_token_type2 = :token"
User.where(query, {token: val}).last
end || user_not_found
我阅读了你的评论,如果你必须这样做,你也可以通过以下方式进行:
val = params[:token_val]
User.where.not(user_token_type1: nil).find_by(user_token_type1: val) || \
User.where.not(user_token_type2: nil).find_by(user_token_type2: val)
但这显然会导致两个查询,其中一个可以完美地完成工作。
你也可以这样做:
User.where("user_token_type1 = ? OR user_token_type2 = ?", params[:user_token], params[:user_token])
此外,删除 User.where.not(user_token_type1: nil)
。向您的模型添加约束,以便您可以信任您的数据,而不是添加该样板。