I have the following query which I want to use with ActiveRecord so that it can be translated in native ORACLE based query on production server. Right now I am using SQLITe.
select c.name,co.code,GROUP_CONCAT(c.name) AS GroupedName
from countries c
INNER JOIN continents co
on c.continent_code = co.code
INNER JOIN event_locations el
on el.location_id = c.id
group by co.code
As long as I know, there's no group_concat
equivalent in Rails, but you can use includes
to do that:
continents = Continents
.joins(:countries, :event_locations)
.includes(:countries)
.group("continents.code")
continents.each do |continent|
continent.countries.join(",")
end
This will produce only 2 queries - I know, is not so good as one, but I think that is the best than Rails can do without "group_concat". The other way will be something like that:
Country
.select("countries.id, GROUP_CONCAT(countries.name) as grouped_name")
.joins(:continents, :event_locations)
.group("continents.code")
But if you do that, you need to change according to your database vendor.
On Rails 6 (I don't know in others), you can do generating only one query if you use select
continents = Continent.joins(:country).select(:name, 'countries.name as country_name')
countries_list = []
continents.each do |continent|
countries_list << continent.country_name
end
I know the code is not grouping by the continent, but my idea was to show how to make the query at once
and how to access the result
. How to group you can do in the way it is better for you.
remember you need create the relationship in Continent class
has_many :country
hope I could help someone yet
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.