Rails:动态排序关联记录

时间:2014-01-11 19:55:08

标签: mysql ruby-on-rails sorting

尝试寻找一种从父模型中对相关记录进行排序的方法,但只是通过在模型文件本身中对排序进行硬编码来提出静态方法。像这个例子:Rails sorting associated records

但我希望使用像RailsCast http://railscasts.com/episodes/340-datatables之类的表来“快速”排序。

如果我的信息显然位于父模型上,那么表工作和排序都很漂亮,但是我不希望我的模型的DB表太宽,所以我想从关联的模型中拉出示例:

Product.order("#{sort_column_p} #{sort_direction}").page(page).per_page(per_page)

def sort_column_p
  columns = %w[sku orders.qty]
  columns[params[:iSortCol_0].to_i]
end
def sort_direction
  params[:sSortDir_0] == "desc" ? "desc" : "asc"
end

当我尝试按此方式排序时,我收到此错误:

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'orders.qty' in
'order clause': SELECT  `products`.* FROM `products`  WHERE `products`.`user_id` = 
1 ORDER BY orders.qty asc LIMIT 20 OFFSET 0)


相关模型是:
父母:产品
儿童:订购
感谢您帮助男女老少!

编辑:顺便说一句,是的,模特有合适的has_many& belongs_to参数在正确的模型中,子项中的外键与父模型正确对齐。


编辑2:经过一系列的调试后,这就是它在SQL中的表现:

< / p>

SELECT Products.sku, Orders.qty
FROM Products
LEFT JOIN Orders
ON Products.id=Orders.product_id


所以现在只需将其转换为Rails格式! :)

1 个答案:

答案 0 :(得分:1)

鉴于您需要LEFT JOIN而不是INNER JOIN,您需要自己指定大部分SQL,即使使用Rails,也需要:

Product.joins('left join orders on products.id=orders.product_id').select('products.sku, orders.qty')

如果您可以使用INNER JOIN,那么这将简化为:

Product.joins(:tables).select('products.sku, orders.qty')