

Rails、SQLは初心者なのでわかりづらい表現があったらすみません。

まず次のモデルを持っています。

[code]

    class City < ActiveRecord::Base
        has_many :favorites
        has_many :users, through: :favorites
    
        has_many :areas
        has_many :countries, through: :areas
    end
    
    
    class Favorite < ActiveRecord::Base
      belongs_to :user
      belongs_to :city
    end
    
    class User < ActiveRecord::Base
        has_many :favorites
        has_many :citys, through: :favorites
    end
    
    
    class Area < ActiveRecord::Base
      belongs_to :city
      belongs_to :country
    end
    
    class Country < ActiveRecord::Base
        has_many :areas
        has_many :citys, through: :areas
    end
    
[/code]

Cityモデルを中心にFavoriteモデルがUserモデルとの中間テーブル。AreaモデルがCountryモデルとの中間テーブルです。

CityモデルとCountryモデルで合致するものを抽出し、その抽出したものをCityモデルがFavoriteモデルに登録されている数が多い順で並び替えたいです。  
例えばCountryモデルの「America」で抽出したもの並び替えたい場合に下のように書いてみましたがうまくいきません。

[code]

    @city = City.includes(:countries).joins(:favorites).group(:city_id).where("name = ?", "America").order('count(city_id) desc')
    
[/code]

どうすればできますでしょうか。


CC BY-SA 3.0
2017-09-21T13:02:11.430
38094
2023-09-29T05:07:15.823
25502
question
ruby-on-rails ruby rails-activerecord
Rails 3つのテーブルを結合後の抽出について


おそらく、こうすると実現できます。

[code]

    distinct_cities =
      City.joins(:countries).select(:id)
        .where(countries: { name: 'America' })
        .group(:id)    
    City
      .joins("INNER JOIN (#{distinct_cities.to_sql}) AS t ON cities.id = t.id")
      .left_joins(:favorites)
      .group('cities.id')
      .select('cities.*', 'count(favorites.id) AS favs')
      .order('favs desc')
    
[/code]


CC BY-SA 4.0
2018-07-07T15:50:55.320
45390
2019-02-06T03:24:10.143
2019-02-06T03:24:10.143
754
754
38094
answer