簡體   English   中英

Rails 6 合並 hash 到 ActiveRecord object

[英]Rails 6 merge hash to ActiveRecord object

我想知道是否可以將 hash 合並到 ActiveRecord object 類似於 SQL 查詢,您可以在其中使用例如SUM(transfers.shares_number) as sold_shares操作數據

長話短說,如果我有一個用戶 object:

=> #<User id: 201253217, email: "daren_hoppe@nicolas.name" >

是否可以將 hash params: params = { sold_shares: 123 }合並到此用戶 object 以獲得:

=> #<User id: 201253217, email: "daren_hoppe@nicolas.name", sold_shares: 123>

值得一提的是, sold_shares不是用戶表中的一列。

我試過使用user.merge(options)但我收到NoMethodError: undefined method merge!' for #<User NoMethodError: undefined method merge!' for #<User

我懷疑 ActiveRecord object 上是否存在合並,但您可以使用assign_attributes方法。

user = User.find(...)
user.assign_attributes(params)

只要在User上定義了sold_shares屬性編寫器:

class User < ApplicationRecord
  # you may wanna use an attr_accessor instead
  attr_writter :sold_shares
end

但是,有幾個缺點:

  • attributes和其他序列化方法不會序列化sold_shares
  • 如果您需要更多屬性,則必須將其添加到您的 model

目前尚不清楚您為什么要嘗試將聚合屬性合並到您的 model 中,因此您的問題很難回答,但這通常不是 Rails 中的工作方式。

獲取聚合 SQL 函數的正常方法只是運行以下代碼:

user.transfers.sum(:shares_number)

這假設您在User model 上有has_many:transfers關聯。

其他SQL聚合函數也有類似方法。

您可以向User model 添加一個sold_shares方法,如果您願意,可以執行此操作,但這不一定會集成到所有 ActiveRecord 功能中,例如,它不會在User#attributes hash 中,也不會出現在inspect /console output 中。

在這里修復所有這些問題時,您可能會變得非常棘手,但對於您實際需要的東西來說,這幾乎肯定是不必要的。 除非萬不得已,否則不要 go 反對谷物。

或者,您獲取模型的屬性和您的擴展並將它們合並到 hash 中,類似於user.attributes.merge('my_field' =>...)

您還可以創建某種實現它的代理 object。 這通常是首選方法,其中 model object 變得過於復雜,但在這里可能有點矯枉過正。

還有“計數器緩存”功能,它確實向數據庫添加了一個(自動管理的)字段,因此將完全集成到屬性 hash 中,但這只是為了計數,而不是求和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM