【问题标题】:Rails: Sorting Associated Records DynamicallyRails:动态排序相关记录
【发布时间】: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


【解决方案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')

【讨论】:

  • 是的,这正是我最终使用的。感谢大家的帮助,还在习惯SQL语句:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多