[英]will_paginate in rails when using join and group by
我注意到,當使用will_paginate 20結果頁面時,將多個表group_by“昵稱”聯接起來,但對輸出進行分頁,但是僅顯示3個“昵稱”(這是有道理的,因為分頁是在group by之前對輸出進行計數),但是我該如何解決呢? 另外,我想顯示這樣的輸出,並根據“昵稱”列限制每頁的項目數:請注意,“數據”表具有許多“首選項”。 (data.id = preferences.data_id)
{
"totalCount": 123,
"pageInfo": {
"currentPage": 1,
"nextPage": 2,
"lastPage": 8
},
"results": [
{
"data": {
"id": 1,
"nickname": "foo"
},
"preferences": [
{
"id": 4479,
"created_at": "2019-05-21T00:39:45.772Z",
"updated_at": "2019-05-21T00:39:45.772Z",
"title": "Check Database",
...
},
...
]
},
...
]
}
data_res = Data.paginate(page: params[:page], per_page:
20).joins("INNER JOIN preferences ON data.id =
preferences.data_id").select("data.*, preferences.*").order(id: :asc)
data_group_by = data_res.group_by { |r| r.nickname }
respond_to do |format|
format.any
format.json {
render :json => {
:totalCount => data_res.total_entries,
:pageInfo => {
:currentPage => data_res.current_page,
:nextPage => data_res.next_page,
:total_pages => data_res.total_pages,
:per_page => data_res.per_page,
},
:results => data_res
}
}
end
如果我正確地理解了您的問題(可能不是),則分頁顯示它有20條記錄,但是您只看到3條記錄被歸還了,因為它們已被分組了?
但是,您想要的是20條記錄,並且對20個首選項進行了分組?
如果是這樣,我認為您可能會使查詢過於復雜。
select("data.*, preferences.*")
因為它基本上只會為獲取的每個首選項添加一條新記錄,因此首選項可能是您要獲取多少條記錄的決定因素,而不是您要在其上進行分頁的data
+您正在向返回的每個數據動態添加其他方法以說明首選項 data_res.group_by { |r| r.nickname }
data_res.group_by { |r| r.nickname }
似乎是不必要的,除非您的數據記錄不是唯一的,在這種情況下,我會質疑將其分組的原因。 我認為,如果昵稱是唯一的,即只能有1個具有相同nickname
data
記錄,這就是我的建議
class Data
has_many :preferences
end
class Preference
belongs_to :data
end
在此處聯接和包含以確保渴望加載首選項,同時符合僅獲取具有首選項數據的現有查詢
data_res = Data.joins(:preference).includes(:preference).paginate(page: params[:page], per_page: 20).order(id: :asc) # this should give you 20 records of data that has preferences
然后,您的序列化程序可以完成其余工作,以確保正確映射數據並確保您的首選項處於同一級別(使用任何序列化程序包均可實現多種方式),例如
class DataPreferencesSerializer < AMS
attributes :data
:preferences # or can be has_many :preferences serializer
def data
{id: object.id, nickname: object.nickname }
end
def preferences
object.preferences
end
end
results= ArraySerializer.new(data_res, each_serializer: DataPreferencesSerializer, root: false)
就像我說的那樣,有幾種方法可以實現序列化,因此上面的實現只是您可能采用的方法的一個想法,而不是特定的實現。
PS:你的INNER JOIN
確保所有返回的data
記錄具有關聯的preferences
,因此,任何data
不具有至少一個preference
是可能從你回來的記錄排除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.