更新nil列

时间:2016-10-06 04:44:06

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

Performance belongs_to :user
User has_one :performance

Performance有许多属性:

  
      
  • USER_ID
  •   
  • attr1,默认:nil
  •   
  • attr2,默认:nil
  •   
  • attr3,默认:nil
  •   
  • .....
  •   

我想要执行

@user.performance.update(
  attr1: 1,
  attr2: 2,
  attr3: 3,
  .....
)

但当然不会因为@user.performance == nil而默认。 属性列表非常长,所以我希望避免重复它们:

unless @user.performance
Performance.create(
  user_id: @user.id,
  attr1: 1,
  attr2: 2,
  attr3: 3,
  .....
) 
else
@user.performance.update(
  attr1: 1,
  attr2: 2,
  attr3: 3,
  .....
)
end

请让我知道如何实现它。谢谢!

我的问题是如何避免在我的代码中重复参数列表。我在createupdate方法中都有相同的参数。

3 个答案:

答案 0 :(得分:0)

您可以使用此处引用的first_or_create apidocks 获取对象的引用或创建它(如果它不存在)。然后根据需要更新它。

答案 1 :(得分:0)

或者使用@user.build_performance(k:v, k1:v1, ..)

这将使早期版本无效或创建新版本,并使用提供的最新属性初始化用户的性能记录。

答案 2 :(得分:0)

你可以这样做:

class User < ActiveRecord::Base

  has_one :performance

  def performance
    super || build_performance
  end

end

然后:

@user.perfomance.update({ 
  attr1: 1,
  attr2: 2,
  attr3: 3,
  # ...
})

如果数据库不存在,则更新将在数据库中创建性能