簡體   English   中英

Rails中的復雜聯接查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM