Порядок модели по разнице в дате в модели has_many - PullRequest
0 голосов
/ 17 сентября 2018

Я не знаю, это точный и простой способ реализации. У меня есть две модели. Модальное «А» принадлежит модальному «В», а «В» имеет много к модальному «А». У меня есть поле даты «дата истечения срока действия» в модели B.

Теперь я хочу перечислить записи модальных «А». Список должен быть в порядке возрастания с разницей даты окончания последней записи соответствующей Модальной 'B' и сегодняшней даты. Я рассчитал разницу в дате, но все еще не понял, как ее заказать.

diff = (f.bill_histories.last.ndate.to_date - DateTime.now.to_date).to_i

Я попробовал и погуглил, но все еще не нашел предложения. Пожалуйста, предложите мне.

Ответы [ 2 ]

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

Проверка разницы Time.zone.now - model_b_object.expiry_date - это ненужный шаг. Просто перейдите непосредственно к части заказа. Это покажет записи модели B, срок действия которых истек ближе к сегодняшней дате.

ModelB.all.order("expiry_date ASC")

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

при условии:

class Foo < ActiveRecord::Base
  belongs_to :bar
end

class Bar < ActiveRecord::Base
  has_many :foos
end

Вы должны иметь возможность сортировки на уровне базы данных, используя оператор соединения в таблице Bar s:

Foo.joins(:bar).order(bars: { expired_at: :desc })

Пояснение:

в порядке возрастания с разницей с датой истечения срока действия последней записи в модальной 'B' и сегодняшней датой

Это означает, что самая новая дата должна быть первой, поэтому простой ORDER BY expired_at DESC должен делать то, что вам нужно.

join необходим, чтобы вы могли использовать столбец Bar s expired_at.

Синтаксис хэша в методе order необходим для доступа к атрибуту таблицы соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...