2015-12-08 40 views
0

我现在有发现我的控制器下面找到设备:导轨由第一属性或第二属性

Device.find_by_token(params[:token])

与UNIQUE_ID更换令牌。

因此,新的查询是:

Device.find_by_unique_id(params[:unique_id])

对于一些较老的请求,unique_id不PARAMS传递和设备将不会被发现。

我怎么可以这样做:

Device.find_by_token_or_unique_id(params[:token], params[:unique_id])

或当然,这并不存在。

而且,我不想做的事:提前

if params[:token] 
    Device.find_by_unique_id(params[:unique_id]) 
else 
    Device.find_by_token(params[:token]) 
end 

感谢。

+0

我知道你不想使用条件,可能你可以使用||运营商。像'Device.find_by_unique_id(params [:unique_id])|| Device.find_by_token(params [:token])' – Sajan

+0

是的,我想到了它,它不是我正在寻找的 – neo

回答

1

我认为这是你在找什么:

Devise.where("token = ? OR unique_id = ?", params[:token], params[:unique_id]).first 
+0

将原始SQL放入您的查询中并不是件好事。 –

+0

如果两个参数都通过了,这将返回所有符合该参数的设备,它会有所作用。 – neo

+0

你说你用'unique_id'替换'token',那么怎么会有两个参数? – Yang

0

铭记以前的答案可能会回报你2项,你可以这样做的选择:

user = Device.where(unique_id: params[:unique_id]).first 
user ||= Device.where(token: params[:token]).first 

或者你可以实现Arel Helpers并能够实际构建它作为查询。 https://github.com/camertron/arel-helpers

我更喜欢使用Arel,因为它使您的代码不再包含任何SQL。

+0

你可能会碰到db两次。 – neo

+0

正确的你是在步骤查询的情况下。但是,在使用Arel时,您可以构建一个不会重复的“OR”查询。 第一个例子只是让它在没有if块的情况下工作的一种方法,但首选的方式是通过Arel。 –