Mysql Rails左连接搜索和json

Mysql Rails左连接搜索和json,mysql,ruby-on-rails,activerecord,ruby-on-rails-5,Mysql,Ruby On Rails,Activerecord,Ruby On Rails 5,我有以下型号: class Address < ActiveRecord::Base has_many :service_records attr_accessor :service_record end class ServiceRecord < ActiveRecord::Base belongs_to :address belongs_to :plant end class Plant < ActiveRecord::Base has_one :s

我有以下型号:

class Address < ActiveRecord::Base
  has_many :service_records
  attr_accessor :service_record
end

class ServiceRecord < ActiveRecord::Base
  belongs_to :address
  belongs_to :plant
end

class Plant < ActiveRecord::Base
  has_one :service_record
end
这将返回正确数量的重复地址结果(即上面示例中的3个)

下一步我要努力弄清楚的是,然后以JSON结构的形式返回结果查询,该结构包含每个地址和每个唯一的服务记录。比如说:

[
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 1
      plant: {
        id: 1
      }
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 2
      plant: {
        id: 2
      }
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 3
      plant: {
        id: 3
      }
    }
  }
]
addresses = Address.left_joins(service_records: :plant)
addresses.as_json
# => [
  {
    id: 1,
    address: "1234 Street Rd"
  },
  {
    id: 1,
    address: "1234 Street Rd"
  },
  {
    id: 1,
    address: "1234 Street Rd"
  }
]

如果您注意到,我的地址模型上确实有一个
attr\u accessor:service\u record
,但是我不确定这是获得所需内容的正确方法。任何帮助或替代方法,以获得我所寻找的将不胜感激

从您的查询中,您可以使用Rails作为带有选项的_json来实现您想要的功能。你可以这样做:

[
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 1
      plant: {
        id: 1
      }
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 2
      plant: {
        id: 2
      }
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 3
      plant: {
        id: 3
      }
    }
  }
]
addresses = Address.left_joins(service_records: :plant)
addresses.as_json
# => [
  {
    id: 1,
    address: "1234 Street Rd"
  },
  {
    id: 1,
    address: "1234 Street Rd"
  },
  {
    id: 1,
    address: "1234 Street Rd"
  }
]
下一步是包含关联

addresses.as_json(include: :service_record)
[
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 1
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 2
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 3
    }
  }
]
最后:

addresses.as_json(include: { service_record: { include: :plant } })
# => [
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 1
      plant: {
        id: 1
      }
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 2
      plant: {
        id: 2
      }
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 3
      plant: {
        id: 3
      }
    }
  }
]
然后可以微调结果。更多关于这方面的信息,请访问

更新


如果确定service_records数组中只有一条记录,则可以执行以下操作:

def service_record
  service_records.first
end
那就这样做吧

addresses.as_json(methods: :service_record)
[
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 1
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 2
    }
  },
  {
    id: 1,
    address: "1234 Street Rd",
    service_record: {
      id: 3
    }
  }
]

服务记录
不是地址模型上的“官方”属性。我只能访问
服务记录
,因为这是模型之间的关联。为什么要设置服务记录属性访问器?我补充了一个可能的想法。我目前没有在任何地方设置它。我希望有一种方法可以将其设置为在查询过程中加入到地址的
服务记录
,但这似乎是不可能的。如果您确定您将只有一个服务记录,您可以有一个方法。我会更新我的答案,告诉你怎么做。这就是问题所在,我不确定只有一个。每个地址可以有零个、一个或多个服务记录,我需要为每个记录提供一个json条目及其相应的地址。