我有這樣的方法:
def transfers(material, capacity, category, created_at)
transfers_range = Transfer.first.created_at..Transfer.last.created_at if created_at.nil?
Transfer.where(
sender_dispensary_id: id,
status: %i[dispatched released returned],
capacity: capacity,
material: material,
created_at: created_at.nil? ? transfers_range : Time.given_month_range(created_at)
).or(
Transfer.where(
receiver_dispensary_id: id,
status: %i[dispatched released returned],
capacity: capacity,
material_id: material,
created_at: created_at.nil? ? transfers_range : Time.given_month_range(created_at)
)
)
end
它正在作業,但是有沒有辦法避免查詢transfer_range?我的意思是......如果created_at == nil,那么這個函式應該跳過created_at列,就像它沒有包含在查詢中一樣
uj5u.com熱心網友回復:
什么時候基本上created_at涵蓋了所有轉移,因此條件是沒有意義的,在這種情況下我會簡單地查詢。niltransfers_rangecreated_at
def transfers(material, capacity, category, created_at)
transfers = Transfer
.where(status: %i[dispatched released returned], capacity: capacity, material_id: material)
.where('sender_dispensary_id = :id OR receiver_dispensary_id = :id', id: id)
transfer = transfer.where(created_at: Time.given_month_range(created_at)) if created_at
transfer
end
uj5u.com熱心網友回復:
是的,transfers_range可以通過將查詢分成多行并created_at分別添加存在條件來避免查詢。您還可以將兩個 OR 查詢組合成一個查詢,如下所示:
def transfers(material, capacity, category, created_at)
transfer_data = Transfer.where('sender_dispensary_id = ? OR receiver_dispensary_id = ?', id).where(status: %i[dispatched released returned], capacity: capacity, material_id: material)
transfer_data = transfer_data.where(created_at: Time.given_month_range(created_at)) if created_at.present?
transfer_data
end
uj5u.com熱心網友回復:
您可以整合 created_at 查詢邏輯,以便將其放在一個位置,而無需重復。
created_at = if created_at.nil?
Transfer.first.created_at..Transfer.last.created_at
else
Time.given_month_range(created_at)
end
您也不需要重復整個 where 條件兩次。你想要相當于...
where status in ('dispatched', 'released', 'returned')
and capacity = ?
and material = ?
and created_at = ?
and (
sender_dispensary_id = ?
or
receiver_dispensary_id = ?
)
你這樣做:
Transfer
.where(
status: %i[dispatched released returned],
capacity: capacity,
material: material,
created_at: created_at
)
.where(
Transfer
.where(receiver_dispensary_id: id)
.or(Transfer.where(sender_dispensary_id: id))
)
)
通過將邏輯放入scopes中,您可以使其更加簡潔,并隱藏細節。
class Transfer < Application
scope :by_dispensary_id ->(id) {
where(receiver_dispensary_id: id)
.or(where(sender_dispensary_id: id))
}
scope :by_created_month ->(time) {
if time.nil?
where(created_at: first.created_at..last.created_at)
else
where(created_at: Time.given_month_range(time))
end
}
end
現在查詢要簡單得多。
Transfer
.by_dispensary_id(id)
.by_created_month(created_at)
.where(
status: %i[dispatched released returned],
capacity: capacity,
material: material
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507442.html
