【发布时间】:2014-01-30 18:31:04
【问题描述】:
尝试寻找一种方法来对父模型中的关联记录进行排序,但只能通过在模型文件本身中硬编码排序来提出静态方法。像这个例子:Rails sorting associated records
但我想使用像 RailsCast http://railscasts.com/episodes/340-datatables 这样的表格“即时”排序。
如果我的信息显然位于父模型上,则该表的工作和排序很好,但我不希望我的模型的数据库表太宽,所以我想从关联的模型中提取示例:
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 中的外观如下:
SELECT Products.sku, Orders.qty
FROM Products
LEFT JOIN Orders
ON Products.id=Orders.product_id
所以现在只需要把它变成 Rails 格式! :)
【问题讨论】:
-
我不确定我是否完全理解它,但你试过
Product.includes(:orders).order(...。错误是说您缺少在查询中包含orders表。 -
感谢您对排序等方面的热情,但您是否看过 Ransack 对您的表格进行排序和搜索?这允许您当前手动实现的所有内容...github.com/activerecord-hackery/ransack
-
DannyVanHoof 我不想再为我的大项目添加一个宝石到我已经很大的宝石集中。不过谢谢你的想法。 @vee 你的答案不是正确的,但它让我得到了正确的答案。SQL 明智。我仍然需要将其更改为 Rails 代码。我编辑了答案以包含执行此操作的 SQL 方式。我相信我可以很容易地弄清楚,但如果你想将它转换为 Rails 语法并将其作为答案,我会投票给你。
标签: mysql ruby-on-rails sorting