Rails: возвращает ограниченное количество записей, а также первый - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть 2 модели Rails, Client и CheckIn:

class Client < ActiveRecord::Base
    has_many :check_ins
end

class CheckIn < ActiveRecord::Base
    belongs_to :client
end

Обычно, когда я получаю все :check_ins для :client, я звоню:

Client.find(1).check_ins

Я заметил, что с увеличением числа :check_ins я теряю память и поэтому хочу вернуть 10 самых последних записей, а также одну самую старую запись .Я также хотел бы, чтобы возвращаемые элементы были #<ActiveRecord::AssociationRelation, а не массивом.

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Объединение самых старых и новейших записей в одном запросе SQL возможно с помощью UNION.Таким образом, вы могли бы написать это как:

query = "(SELECT * FROM #{CheckIn.table_name} WHERE client = :client_id ORDER BY created_at DESC LIMIT 10) UNION (SELECT * FROM #{CheckIn.table_name} WHERE client = :client_id ORDER BY created_at ASC LIMIT 1)"
CheckIn.find_by_sql [query, { client_id: client_id }]

Однако результатом будет Array, а не ActiveRecord::AssociationRelation

0 голосов
/ 20 сентября 2018

Я думаю, что scoping - это то, что вы ищете

  class CheckIn < ActiveRecord::Base
    belongs_to :client
    scope :recent, -> { order(created_at: :desc).limit(10) }
    scope :oldest, -> { order(created_at: :asc).limit(10) }
  end

  > Client.find(1).check_ins.recent
  => #<ActiveRecord::AssociationRelation [ ...]>
  > Client.find(1).check_ins.oldest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...