【发布时间】:2019-12-05 21:04:20
【问题描述】:
我有这些模型:
class Product < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :product
end
我想获取至少订购过一次的所有产品的列表,以及下单时间的时间戳 (orders.created_at) 和订单代码 (orders.no) 以及管理员处理了订单(orders.processed_by_admin_id)。最后,我想通过orders.created_at 列出输出。
经过一番谷歌搜索,我想出了这样的东西:
Product.joins(:orders)
.group("(products.id) having count(products.id) > 0")
.select("products.*", "max(orders.created_at) as last_order_time")
.sort_by(&:last_order_time).reverse
这让我得到了至少一次订购的产品列表,按时间戳排序。但是,我被困在这里无法获取orders.no 和orders.processed_by_admin_id。我不确定我遵循的程序是否正确。
所需的输出类似于:
products.* | last_order_time | order_no | order_processed_by_admin_id
任何建议表示赞赏。
【问题讨论】:
-
我尝试了很多次以获得类似的效果,但总是失败。它表明通过 ActiveRecord 对模型 Product 进行 SQL 查询,您只能在该模型的模式定义的结果字段中获得。因为我在需要时从不需要生产中的这些数据,所以我只是添加
as来查询以欺骗 ActiveRecord。所以前。.select("products.id", "max(orders.created_at) as products.field_you dont_need", "orders.no", "orders.processed_by_admin_id")我希望你可以通过一些attr_reader来实现它,但不幸的是没有。所以不仅仅是帮助我还在等待答案 -
当然你可以通过像
Product.connection.select_all('sql')这样的原始查询得到它,但它不会给出对象,只是简单的记录
标签: ruby-on-rails ruby postgresql activerecord