簡體   English   中英

使用join和group by時,rails中的will_paginate

[英]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個首選項進行了分組?

如果是這樣,我認為您可能會使查詢過於復雜。

  1. 我認為您不應該使用select("data.*, preferences.*")因為它基本上只會為獲取的每個首選項添加一條新記錄,因此首選項可能是您要獲取多少條記錄的決定因素,而不是您要在其上進行分頁的data +您正在向返回的每個數據動態添加其他方法以說明首選項
  2. 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.

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