我在名爲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
列。
編輯
繼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`));
共享進展
我設法得到它通過以下ORM工作:
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
嘿,我的回答有幫助嗎?你有沒有得到它的工作? –