[英]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 中,因此您的問題很難回答,但這通常不是 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.