Rails find_or_initialize_by加入ActiveRecord :: AssociationTypeMismatch

时间:2016-05-09 06:44:01

标签: ruby-on-rails ruby-on-rails-4

我有两个型号

users (id, name, ...)
authorizations (id, provider, provider_uid, user_id,...)
  

用户has_many授权

现在,当我必须通过facebook登录时,我需要检查provider_uid是否已预设,如果没有创建新的。

user = User.joins(:authorizations).find_or_initialize_by(
      authorizations: {
        provider: 'facebook',
        provider_uid: provider_uid
      }
    )

错误

  

ActiveRecord :: AssociationTypeMismatch - 授权(#70336918074440)   期待,得到阵列(#70336893054160):

1 个答案:

答案 0 :(得分:1)

请尝试使用first_or_initialize代替这两种方案

如果要初始化user对象

,可以尝试此操作
user = User.joins(:authorizations).where("authorizations.provider = 'facebook' AND authorizations.provider_uid = ?", provider_uid).first_or_initialize

但是,如果您想为现有用户查找或创建授权,可以执行此操作,您可以使用first_or_initialize

authorization = Authorization.where(user_id: user_id, provider: 'facebook', provider_uid: provider_uid).first_or_initialize
authorization.save if authorization.new_record?

希望这有帮助!