ruby - 如何仅更新 Hanami 模型中已更改的属性?

标签 ruby hanami hanami-model

鉴于我使用的是 Hanami 模型版本 0.6.1,我希望存储库仅更新实体的更改属性。

例如:

user_instance1 = UserRepository.find(1)
user_instance1.name = 'John'

user_instance2 = UserRepository.find(1)
user_instance2.email = 'john@email.com'

UserRepository.update(user_instance1)
#expected: UPDATE USER SET NAME = 'John' WHERE ID = 1

UserRepository.update(user_instance2)
#expected: UPDATE USER SET EMAIL = 'john@email.com' WHERE ID = 1

但实际上第二个命令覆盖了所有字段,包括那些未更改的字段。

我知道我可以使用 Hanami::Entity::DirtyTracking 获取所有更改的属性,但我不知道如何使用这些属性部分更新实体。

有办法吗?

最佳答案

hanami 实体是一个不可变的数据结构。这就是为什么您不能使用 setter 更改数据的原因:

>> account = AccountRepository.new.first
=> #<Account:0x00007ffbf3918010 @attributes={ name: 'Anton', ...}>

>> account.name
=> "Anton"

>> account.name = "Other"
        1: from /Users/anton/.rvm/gems/ruby-2.5.0/gems/hanami-model-1.2.0/lib/hanami/entity.rb:144:in `method_missing'
NoMethodError (undefined method `name=' for #<Account:0x00007ffbf3918010>)

相反,您可以创建一个新的实体,例如:

# will return a new account entity with updated attributes
>> Account.new(**account, name: 'A new one')

此外,您可以对旧实体对象使用 #update:

>> AccountRepository.new.update(account.id, **account, name: 'A new name')
=> #<Account:0x00007ffbf3918010 @attributes={ name: 'Anton', ...}>

>> account = AccountRepository.new.first
=> #<Account:0x00007ffbf3918010 @attributes={ name: 'Anton', ...}>

>> account.name
=> "A new name"

关于ruby - 如何仅更新 Hanami 模型中已更改的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142802/

相关文章:

Hanami 路线助手在模板中不起作用

ruby - Hanami - 如何正确检查模型是否已保留?

ruby - gem install bson 在 Windows 10 上失败

ruby - 如何在迁移中加载 Hanami 模型?

ruby - 关于性能的数据库设计问题

ruby - Hanami,显示 'post' Controller / View

ruby - 如何启动中间人?无法加载此类文件 -- less (LoadError)

ruby-on-rails - Ruby %r{ } 表达式

ruby - Merb 的文档真的像看起来那么糟糕吗?

ruby-on-rails - 在 ruby​​ on Rails 中销毁客户/订单