是否有相当于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)
任何想法?