【问题标题】:Rails 4 where clause on nested joined tables嵌套连接表上的 Rails 4 where 子句
【发布时间】:2017-06-20 17:56:38
【问题描述】:

目前我有这个查询:

Mother.joins(camp: [{ sub_center: [{ health_center: :block }] }])

它本质上通过campsub_centerhealth_center 表将mother 表连接到block 表(我知道这需要很多)。我希望能够做这样的事情:

Mother.joins(camp: [{ sub_center: [{ health_center: :block }] }]).where(sub_center_id: 1)

但是,我知道 sub_center_id 是一个未定义的列 PG::UndefinedColumn: ERROR: column mothers.sub_center_id does not exist

如何让它查询camp.sub_center_id 而不是mother.sub_center_id?换句话说,如何在嵌套连接表上执行 where 子句?

这是给定表的架构:

create_table "mothers", force: :cascade do |t|
    t.integer  "camp_id"
    t.integer  "eligible_couple_id"
    t.string   "pcts_id"
    t.integer  "thumb_id"
    t.string   "survey_id"
    t.string   "necklace_id"
    t.integer  "necklace_replacement_number", default: 0
    t.boolean  "facility_referral_true",      default: false
    t.float    "weight_at_las_pnc"
    t.integer  "created_by"
    t.integer  "updated_by"
    t.datetime "created_at",                                  null: false
    t.datetime "updated_at",                                  null: false
    t.string   "reg_id"
    t.string   "nfc_data"
    t.datetime "date_of_registration"
    t.integer  "status",                      default: 1,     null: false
    t.datetime "deleted_at"
    t.datetime "completed_at"
  end

create_table "camps", force: :cascade do |t|
    t.string   "english_name"
    t.string   "local_name"
    t.float    "latitude"
    t.float    "longitude"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "created_by"
    t.integer  "updated_by"
    t.integer  "sub_center_id"
    t.integer  "week_of_the_month"
    t.integer  "status",            default: 1
    t.integer  "day"
    t.datetime "deleted_at"
  end

  create_table "health_centers", force: :cascade do |t|
    t.integer  "block_id"
    t.string   "english_name"
    t.string   "local_name"
    t.boolean  "phc_true",         default: false
    t.boolean  "ipd_true",         default: false
    t.boolean  "fru_true",         default: false
    t.boolean  "always_open_true", default: false
    t.string   "phone_number"
    t.integer  "created_by"
    t.integer  "updated_by"
    t.datetime "created_at",                       null: false
    t.datetime "updated_at",                       null: false
    t.integer  "status",           default: 1
    t.datetime "deleted_at"
  end

create_table "sub_centers", force: :cascade do |t|
    t.integer  "health_center_id"
    t.string   "english_name"
    t.string   "local_name"
    t.boolean  "phc_true",         default: false
    t.boolean  "ipd_true",         default: false
    t.boolean  "fru_true",         default: false
    t.boolean  "always_open_true", default: false
    t.string   "phone_number"
    t.float    "latitude"
    t.float    "longitude"
    t.integer  "created_by"
    t.integer  "updated_by"
    t.datetime "created_at",                       null: false
    t.datetime "updated_at",                       null: false
    t.integer  "status",           default: 1
    t.datetime "deleted_at"
  end

  create_table "blocks", force: :cascade do |t|
    t.string   "english_name"
    t.string   "local_name"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "created_by"
    t.integer  "updated_by"
    t.integer  "status",       default: 1
    t.datetime "deleted_at"
  end

【问题讨论】:

    标签: ruby-on-rails database postgresql ruby-on-rails-4


    【解决方案1】:

    您始终可以使用字符串方法来引用列,而不是使用符号。

    Mother.
      joins(camp: { sub_center: { health_center: :block } }).
      where('camps.sub_center_id = ?', 1)
    

    或者用符号方法

    Mother.
      joins(camp: { sub_center: { health_center: :block } }).
      where(camps: { sub_center_id: 1 } )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多