Rails选择并订购

时间:2011-06-18 07:15:28

标签: ruby-on-rails associations

我正在尝试从关联中选择一个列的计数,但它似乎不起作用。这是我的代码:

  
scope :search, lambda { |search, order_syntax|
    select("*, COUNT(payment_notifications.p_type) AS number_of_objects")
    {
      :conditions =>
      ['items.title LIKE ? OR items.desc LIKE ? OR taggings.context LIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"],
      :include => [:taggings, :payment_notifications, :user],
      :order => 'number_of_objects'
    }
  }      
  

我想要达到的目标是: 我想按购买次数订购。所以,让我们说这是我的payment_notifications表:

  
    

item_id | P_TYPE

         

2 | '付款'

         

2 | '付款'

         

6 | '付款'

         

2 | '付款'

         

3 | '付款'

         

6 | '付款'

         

零| '撤回'

  

订单应该是这样的: 2 6 3

希望你明白。

提前致谢。

3 个答案:

答案 0 :(得分:1)

找到我的解决方案。需要使用计数器缓存。谢谢大家!

答案 1 :(得分:0)

您还应该在订单栏中包含itme_id

:order => 'item_id,number_of_objects'

答案 2 :(得分:0)

首先,您应该使用普通方法而不是范围,因为查询相当复杂,结果将完全相同(更容易格式化)。

其次,当你不在任何地方使用它时,我不确定你为什么在lambda中有一个参数“order_syntax”。

这是我建议的(使用新的Active Record链接语法)。我没有对它进行测试,但如果我理解了您的原始查询,它应该可以工作。

def search(term)
  select("*, COUNT(payment_notifications.p_type) AS number_of_objects").
    where('items.title LIKE ? OR items.desc LIKE ? OR taggings.context LIKE ?', "%#{term}%", "%#{term}%", "%#{term}%").
      includes(:taggings, :payment_notifications, :user).
        order('number_of_objects')
end