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条目及其相应的地址。