ActiveRecord - find_by v / s在哪里

时间:2011-01-08 17:01:45

标签: ruby-on-rails

rails构造之间有什么区别:

authentication = Authentication.where(:provider=>omniauth['provider'], :uid=>omniauth['uid'])
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])

我的问题是,如果我使用第一个构造(.where) - 我无法获得关联。我的模型身份验证'属于'模型用户。如果我使用第一个构造搜索身份验证,我无法通过:authentication.user获取关联用户,但同样的事情适用于第二个版本。

由于Heroku问题,我想使用第一个构造而不是第二个构造: http://docs.heroku.com/database:PGError:ERROR:运算符不存在:字符变化=整数。

2 个答案:

答案 0 :(得分:1)

  

PGError:ERROR:运算符不存在:字符变化=整数。

这不是heroku问题。自8.4或8.3以来Postgresql引入了更严格的类型检查。例如,如果列“position”是整数,则无法编写此sql:

select * from orders where position = '1';

它将返回与您类似的错误。

你可以尝试:

auth = Authentication.find :all, :conditions => ["provider = ? and uid = ?", provider, uid]

答案 1 :(得分:1)

重新发表评论的好答案:

也许在omniauth ['uid']上调用.to_s,所以rails认为它是字符串并将其作为varchar传递给postgres?