如何在单个查询中获取另一个特定父对象的子对象的父对象

时间:2017-01-19 10:47:27

标签: ruby-on-rails postgresql activerecord

说明

在我的Rails 5应用程序中,

父模型order.rb

class Order < ApplicationRecord
  has_many :tasks
end

儿童模型task.rb

class Task < ApplicationRecord
  belongs_to :order
  belongs_to :rider
end

rider.rb

class Rider < ApplicationRecord
  has_many :tasks
end

父级和任务属性schema.rb

create_table "orders", force: :cascade do |t|
  t.string   "status"
  t.boolean  "urgent"
  t.date     "schedule"
  t.integer  "customer_id"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
  t.integer  "company_id"
  t.index ["company_id"], name: "index_orders_on_company_id", using: :btree
  t.index ["customer_id"], name: "index_orders_on_customer_id", using: :btree
end


create_table "tasks", force: :cascade do |t|
  t.boolean  "task_type"
  t.string   "details"
  t.string   "address"
  t.string   "nearby"
  t.float    "lat"
  t.float    "lng"
  t.string   "name"
  t.string   "contact"
  t.time     "time"
  t.string   "item_type"
  t.integer  "order_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer  "rider_id"
  t.integer  "status"
  t.index ["order_id"], name: "index_tasks_on_order_id", using: :btree
end

现在让我们假设,

  • 我的数据库中有3个orders,每个order有5个tasks
  • 前2 tasks的{​​{1}}中的1个属于此骑手orders
  • 所以基本上,无论my_rider = Rider.find(1)中有多少tasks,如果order分配了任何rider,我们就会显示task@assigned_orders信息中心上,应该有my_rider分配了orders的所有my_rider,在我的情况下,这是{3}中的前2个task
  • 我不知道我是否解释正确:/

问题

  • 我想在其信息中心显示orders @assigned_orders
  • 我希望我的my_rider发出一个查询,并将所有ActiveRecordorders一起获取。

我试过了,

tasks

但它为my_rider = Rider.find(1) @assigned_orders = Task.joins(:order).where(rider: my_rider) 实例变量中的tasks个对象提供了@assigned_orders

我无法使用Parent(orders)模型进行查询,因为它与Order模型没有任何关联。

请帮我找到解决此问题的方法。提前谢谢!

2 个答案:

答案 0 :(得分:3)

就像ABC一样简单。添加has_many :through关联,以设置ridersorders之间的关联。

class Rider < ApplicationRecord
  has_many :tasks
  has_many :orders, -> { distinct }, through: :tasks
end

然后使用它。

my_rider = Rider.find(1)
@assigned_orders = my_rider.orders  

您也可以在没有关联的情况下进行此操作。

@assigned_orders = Order.joins(:tasks).where(tasks: {rider_id: my_rider.id}).distinct 

答案 1 :(得分:1)

您的任务表中有rider_id列。因此我猜您可以进行以下查询:

Order.joins(:tasks).where(tasks: { rider_id: my_rider.id }).distinct