小编rom*_*les的帖子

分配属性而不覆盖非零数据

是否有相当于assign_attributes不覆盖属性的方法?

让我用一个简单的例子来解释一下:

my_model = MyModel.new(first_name: 'Romain', age: nil)

new_attributes = {first_name: 'Pierre', last_name: 'Roger', age: 27}
my_model.assign_attributes(new_attributes)
# What I get : <first_name='Pierre', last_name='Roger', age=27>
#  * Romain is overwritten by Pierre
#  * nil is overwritten by 27
# What I would like : <first_name='Romain', last_name='Roger', age=27>
#  * Romain isn't overwritten by Pierre
#  * nil is overwritten by 27
Run Code Online (Sandbox Code Playgroud)

我知道我可以做这样的事情,但这似乎不对:

new_attributes.merge(
    my_model.slice(:first_name, :last_name, :age)
            .select { |_, val| !val.nil? }
)
my_model.assign_attributes(new_attributes)
Run Code Online (Sandbox Code Playgroud)

任何想法?

ruby-on-rails

5
推荐指数
1
解决办法
3831
查看次数

标签 统计

ruby-on-rails ×1