我有一個回傳用戶報告的控制器,其中一種方法總結了每個用戶所述報告的要點。我想將此資料的物件傳回前端,以便顯示。理想情況下,我的物件的形狀如下:
data: {
users: {
$user_id: {
name: "Foo Bar",
points: 100
},
$user_id: {
name: "Foo Bar Two",
points: 10
}
}
}
但是,我當前的實作不是像這樣構建物件,而是簡單地添加到一個大物件中。
我的代碼如下所示:
def user_points
hash = {}
User.all.each do |u|
user_points = Report.select("points").where("user_id = ?", u.id).sum("points")
hash.merge!(
user:
{
first_name: u.first_name,
last_name:u.last_name,
time_zone: u.time_zone
}
)
end
render json: { data: hash }
end
并且生成的物件僅包含一個大物件中的最后一個用戶
data:
user:
first_name: "Test"
last_name: "Test"
points: 200
time_zone: "Pacific Time (US & Canada)"
uj5u.com熱心網友回復:
您還可以通過聯接兩個表然后對聯接表執行聚合來獲得相同的結果。
select users.id, users.name, sum(reports.points) as points from users join reports on users.id = reports.user_id group by users.id;
sql小提琴
謝謝你最大的評論。
def user_points
result = User.join(:reports)
.select(
:first_name,
:last_name,
Report.arel_table[:points].sum.as(:points),
:time_zone
)
.group(:id)
render json: { data: result }
end
輸出:
data:
first_name: "Test1"
last_name: "Test1"
points: 100
first_name: "Test2"
last_name: "Test2"
points: 200
first_name: "Test3"
last_name: "Test3"
points: 300
uj5u.com熱心網友回復:
正如 dbugger 所提到的,您需要為每個哈希條目提供一個唯一鍵,否則合并只會替換現有值。
例如:
{a: :foo}.merge(b: :bar)
=> {:a=>:foo, :b=>:bar}
和
{a: :foo}.merge(b: :bar).merge(a: :foo_bar)
{:a=>:foo_bar, :b=>:bar}
您可能需要考慮回傳 json 陣列而不是具有唯一屬性名稱的物件。
也許是這樣的?
def user_points
result = User.all.map do |u|
points = Report.select("points").where("user_id = ?", u.id).sum("points")
{
first_name: u.first_name,
last_name:u.last_name,
time_zone: u.time_zone
points: points
}
end
render json: { data: result }
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430944.html
