传递给find_or_create_by的块不起作用

时间:2015-10-16 15:57:40

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

我的模型User包含属性statusemailstatus可以是:active:pending:invited默认状态为:active)。我想检查已经传递的电子邮件的用户是否已经存在并检查它是否存在,否则我想创建一个带有status = :invited的新用户。要做到这一点,我使用:

user = User.find_or_create_by!(email: params[:email]) do |u|
  u.status = :invited
end

,如http://guides.rubyonrails.org/active_record_querying.html#find-or-create-by

问题是以这种方式创建时,新用户再次status = :active

> user = User.find_or_create_by!(email: 'example@example.com') do |u|
>   u.status = :invited
> end

> user.status 
=> "active"

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

来自您关联的文档:

  

只有在创建客户端时才会执行该块。我们第二次运行此代码时,将忽略该块。

首次创建用户时,状态仅设置为:invited。如果它找到了一个拥有该电子邮件的用户,那么它将返回该用户,其状态设置为已经存在的状态(' active'我认为)。

如果状态设置为活动状态,则表明用户已存在该电子邮件。

答案 1 :(得分:0)

如果您将状态字段视为枚举,则应将其存储为整数。 这里的问题是status字段的数据类型是string。

user = User.find_or_create_by!(email: 'example@example.com') do |u|
  u.status = :invited
end

由于状态字段的非常规映射,enum没有正确解析值。

将状态列数据类型更改为整数后,它将正常工作,这是rails中枚举的基本约定。