一次通话获取 parent.all 上的最新 child - Rails 4
Get newest child on parent.all in one call - Rails 4
我有 2 个模型,orders
和 order_status_details
。最后一个只是每个订单的状态变化历史。
class Order < ActiveRecord::Base
has_many :order_status_details, :dependent => :destroy
end
class OrderStatusDetail < ActiveRecord::Base
belongs_to :order, foreign_key: :order_id
end
我收到了所有订单:
@orders = Order.all.order('id DESC')
现在,我想包括最新状态。例如:
+----+-----------+---------------------+---------------------+----------+
| id | status_id | created_at | updated_at | order_id |
+----+-----------+---------------------+---------------------+----------+
| 1 | 1 | 2016-01-31 04:00:00 | 2016-01-31 04:00:00 | 7 |
+----+-----------+---------------------+---------------------+----------+
| 2 | 3 | 2016-01-31 05:00:00 | 2016-01-31 05:00:00 | 7 |
+----+-----------+---------------------+---------------------+----------+
| 3 | 5 | 2016-01-31 06:00:00 | 2016-01-31 06:00:00 | 7 |
+----+-----------+---------------------+---------------------+----------+
正确的必须是行 #3,状态 #5。
检查我的 schema.rb:
create_table "order_status_details", force: :cascade do |t|
t.integer "status_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "order_id", limit: 4
end
create_table "order_statuses", force: :cascade do |t|
t.string "name", limit: 255
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "paid"
end
create_table "orders", force: :cascade do |t|
t.integer "customer_id", limit: 4
t.decimal "subtotal", precision: 10
t.decimal "tax", precision: 10
t.decimal "total", precision: 10
t.integer "invoice", limit: 4
t.integer "shipping_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.decimal "comission", precision: 10
t.string "comment", limit: 255
end
如何一次调用?
谢谢。
您需要将查询写成:
Order
.joins(order_status_details: :order_status)
.order('id DESC')
.where(
"order_status_details.status_id = \
(SELECT max(status_id) FROM order_status_details)"
)
.select("orders.*, order_statuses.name")
我有 2 个模型,orders
和 order_status_details
。最后一个只是每个订单的状态变化历史。
class Order < ActiveRecord::Base
has_many :order_status_details, :dependent => :destroy
end
class OrderStatusDetail < ActiveRecord::Base
belongs_to :order, foreign_key: :order_id
end
我收到了所有订单:
@orders = Order.all.order('id DESC')
现在,我想包括最新状态。例如:
+----+-----------+---------------------+---------------------+----------+
| id | status_id | created_at | updated_at | order_id |
+----+-----------+---------------------+---------------------+----------+
| 1 | 1 | 2016-01-31 04:00:00 | 2016-01-31 04:00:00 | 7 |
+----+-----------+---------------------+---------------------+----------+
| 2 | 3 | 2016-01-31 05:00:00 | 2016-01-31 05:00:00 | 7 |
+----+-----------+---------------------+---------------------+----------+
| 3 | 5 | 2016-01-31 06:00:00 | 2016-01-31 06:00:00 | 7 |
+----+-----------+---------------------+---------------------+----------+
正确的必须是行 #3,状态 #5。
检查我的 schema.rb:
create_table "order_status_details", force: :cascade do |t|
t.integer "status_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "order_id", limit: 4
end
create_table "order_statuses", force: :cascade do |t|
t.string "name", limit: 255
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "paid"
end
create_table "orders", force: :cascade do |t|
t.integer "customer_id", limit: 4
t.decimal "subtotal", precision: 10
t.decimal "tax", precision: 10
t.decimal "total", precision: 10
t.integer "invoice", limit: 4
t.integer "shipping_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.decimal "comission", precision: 10
t.string "comment", limit: 255
end
如何一次调用?
谢谢。
您需要将查询写成:
Order
.joins(order_status_details: :order_status)
.order('id DESC')
.where(
"order_status_details.status_id = \
(SELECT max(status_id) FROM order_status_details)"
)
.select("orders.*, order_statuses.name")