У меня есть следующий метод в модели с именем CashTransaction
.Извлечение записей, которые удовлетворяют функции модели в Rails
def is_refundable?
self.amount > self.total_refunded_amount
end
def total_refunded_amount
self.refunds.sum(:amount)
end
Теперь мне нужно, чтобы извлечь все записи, которые удовлетворяют указанным выше функции записи, которые т.е. возвращают true
.
я получил, что работает, используя следующее заявление:
CashTransaction.all.map { |x| x if x.is_refundable? }
Но результат является Array
. Я ищу ActiveRecord_Relation
объект, так как мне нужно выполнить join
на результат.
Я чувствую, что здесь что-то не хватает, поскольку это не выглядит так сложно. В любом случае, это заставило меня застрять. Конструктивные предложения были бы замечательными.
Примечание: amount
является колонкой CashTransaction
.
EDIT
После SQL
делает работу. Если я могу изменить это на ORM
, он все равно выполнит эту работу.
SELECT `cash_transactions`.* FROM `cash_transactions` INNER JOIN `refunds` ON `refunds`.`cash_transaction_id` = `cash_transactions`.`id` WHERE (cash_transactions.amount > (SELECT SUM(`amount`) FROM `refunds` WHERE refunds.cash_transaction_id = cash_transactions.id GROUP BY `cash_transaction_id`));
Sharing Прогресс
мне удалось получить его работу, следуя ОРМ:
CashTransaction
.joins(:refunds)
.group('cash_transactions.id')
.having('cash_transactions.amount > sum(refunds.amount)')
Но что я на самом деле ищет что-то вроде:
CashTransaction.joins(:refunds).where(is_refundable? : true)
где is_refundable?
является модельной функцией. Первоначально я думал, что установка is_refundable?
будет работать attr_accesor
. Но я был неправ.
Просто подумайте, можно ли устранить проблему элегантным способом, используя Arel
.
@ AndreyDeineko, я нашел работу вокруг. Можете ли вы посмотреть мое редактирование и поделиться своим мнением? – abhinavmsra
эй, был ли мой ответ полезен? вы его работали? –