Ruby on rails Rails和RABL根据子对象所属的另一个模型对其进行排序
我有3种型号:Ruby on rails Rails和RABL根据子对象所属的另一个模型对其进行排序,ruby-on-rails,rabl,Ruby On Rails,Rabl,我有3种型号: class City < ActiveRecord::Base has_many :buildings end class Company < ActiveRecord::Base has_many :buildings end class Building < ActiveRecord::Base belongs_to :city belongs_to :company end 我不知道如何进行查询,或者如何正确使用rabl来生成这个输出结构
class City < ActiveRecord::Base
has_many :buildings
end
class Company < ActiveRecord::Base
has_many :buildings
end
class Building < ActiveRecord::Base
belongs_to :city
belongs_to :company
end
我不知道如何进行查询,或者如何正确使用rabl来生成这个输出结构
编辑:
SELECT
cities.name, companies.name, buildings.name
FROM
cities
LEFT JOIN
companies ON companies.city_id = city.id
LEFT JOIN
buildings ON buildings.city_id = city.id
ORDER BY
cities.name, companies.name, buildings.name
这就是我目前的想法:
cities_controlles.rb:
def index
@cities = City.all
@companies = Company.includes(:buildings)
end
index.json.rabl:
collection @cities
attributes :id, :name
node :companies do |city|
@companies.map do |company|
{ id: company.id, name: company.name, buildings:
company.buildings.map do |building|
if building.city_id == city.id
{ id: building.id, name: building.name }
end
end.compact
}
end
end
有很多方法可以做到这一点,这取决于如何使用rezult 第一种方式:
SELECT
cities.name, companies.name, buildings.name
FROM
cities
LEFT JOIN
companies ON companies.city_id = city.id
LEFT JOIN
buildings ON buildings.city_id = city.id
ORDER BY
cities.name, companies.name, buildings.name
Rezult应该是这样的:
city1 | company1 | building1
city1 | company1 | building2
city1 | company2 | building3
city2 | company1 | building4
city2 | company1 | building5
city2 | company1 | building6
city2 | company2 | building7
city2 | company2 | building7
city1 | company1 | building1, building2
city1 | company2 | building3
city2 | company1 | building4, building5, building6
city2 | company2 | building7, building8
你可以用那张桌子做任何你想做的事
第二种方式(使用聚合函数获取城市和公司的建筑列表):
这样Rezult应该是这样的:
city1 | company1 | building1
city1 | company1 | building2
city1 | company2 | building3
city2 | company1 | building4
city2 | company1 | building5
city2 | company1 | building6
city2 | company2 | building7
city2 | company2 | building7
city1 | company1 | building1, building2
city1 | company2 | building3
city2 | company1 | building4, building5, building6
city2 | company2 | building7, building8
注意聚合函数的名称(GROUP_CONCAT-用于MySQL)在DBMS中不同。例如,在firebird中,它是“列表”