[英]Complex Join Queries in Rails
我有3個表格-場地,用戶和更新(評分為整數)-我想編寫一個查詢,該查詢將返回我所有場地的列表及其平均評分,僅使用每個場地的最新更新人,場所對。 例如,如果用戶1在上午9點對場所A評分為4,然后在下午5點對場所A評分為3,則我只想使用等級3,因為它是最近的。 還有一些可選條件,例如更新必須多久一次,以及是否存在用戶ID數組,這些用戶必須位於其中。
有沒有人建議這樣寫的最好方法是干凈,高效? 我寫了下面的named_scope應該可以解決這個問題,但這很丑陋:
named_scope :with_avg_ratings, lambda { |*params|
hash = params.first || {}
has_params = hash[:user_ids] || hash[:time_ago]
dir = hash[:dir] || 'DESC'
{
:joins => %Q{
LEFT JOIN (select user_id, venue_id, max(updated_at) as last_updated_at from updates
WHERE type = 'Review' GROUP BY user_id, venue_id) lu ON lu.venue_id = venues.id
LEFT JOIN updates ON lu.last_updated_at = updates.updated_at
AND updates.venue_id = venues.id AND updates.user_id = lu.user_id
},
:select => "venues.*, ifnull(avg(rating),0) as avg_rating",
:group => "venues.id",
:order => "avg_rating #{dir}",
:conditions => Condition.block { |c|
c.or { |a|
a.and "updates.user_id", hash[:user_ids] if hash[:user_ids]
a.and "updates.updated_at", '>', hash[:time_ago] if hash[:time_ago]
} if has_params
c.or "updates.id", 'is', nil if has_params
}
}
}
我加入了最后一個“ updates.id為null”條件,因為我仍然希望返回場地,即使它們沒有任何關聯的更新。
謝謝,埃里克
kes,對我來說,這似乎是find_by_sql
的工作。 當您做的事情很復雜時,我發現最好把工作從ActiveRecord和DIY上移開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.