Если я правильно понимаю ваш вопрос (возможно, нет), нумерация страниц говорит, что у него 20 записей, но вы видите только 3 возвращаемых записи, потому что они сгруппированы?
Тем не менее, что вы хотите - это 20 записей, сгруппированные по 20x предпочтениям?
Если это так, я думаю, вы, вероятно, слишком усложняете свой запрос.
- Я не думаю, что вам следует использовать
select("data.*, preferences.*")
, потому что он просто добавляет новую запись для каждой выбранной настройки, поэтому предпочтения, вероятно, являются определяющим фактором того, сколько записей вы получаете, а не data
, на которых вы нумерация страниц + вы динамически добавляете дополнительные методы к каждому из данных, возвращаемых для учета предпочтений
data_res.group_by { |r| r.nickname }
кажется ненужным, если только у вас нет не уникальных записей данных, и в этом случае я бы поставил под сомнение причину их группировки по этому.
По моему мнению, если псевдонимы уникальны, то есть может быть только 1 data
запись с тем же nickname
, вот что я бы предложил
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
, вероятно, исключен из записей, которые вы получаете назад.