我正在做的一个应用,允许用户注册时填写用户名和电子邮件,并且登录时可以任选一个。因为以前没做个这样的事情,所以我自己想了一下这样来实现了:
登陆表单给一个 input,用户填写用户名和电子邮件都可以(二选一)
取值以后使用以下方法取得用户:
# identifier 是从表单里获得的值
def self.find_by_identifier(identifier)
where('username = ? OR usermail = ?', identifier, identifier).first
end
目前这么做可以,但是我发现这样取出来的用户不是一个 object,而是一个 array,获得的 user object 在这个 array 当中,得再用 first 把它取出来。我想这是因为我的查询条件里是 OR 的缘故吧?
我仔细考虑了一下,应该不会出现查询错误(新手程序员,缺乏经验),但是我不知道这样做是否是最好的方式,总觉得返回一个数组(尽管只有一项在数组里)怪怪的……大家觉得呢?有什么更好的方式教一下我呢?
我前不久也遇到,也用了最简单的方法,帮看看有木有问题
user = User.find_by_name(params[:session][:name]) || User.find_by_email(params[:session][:email].to_s.downcase)
当然存储是加了验证的,规则如下,正好避免某 email 和某用户名冲突 VALID_NAME_REGEX = /^(?!)(?!.*?$)[a-zA-Z0-9_\u4e00-\u9fa5]{1,50}$/ VALID_EMAIL_REGEX = /\A[\w+-.]+@[a-z\d-.]+.[a-z]+\z/i
devise 的 wiki 里有提到思路,你可以借鉴 但不一定用 devise 其实关键思路就是你这样 @iBachue 我印象里是不需要自己加 limit 的 rails3 的 query chain 遇到 first 的时候 会自动加上 limit 1