あけましておめでとうございます!
この前、初めてN+1問題というのを知り、何も考えずに打ったコードを改善しようとしている初心者です。よろしくお願いいたします!
has_manyの子モデルから特定のカラムを取得する場合にSQLが発生することは、致し方がないことなのですか?
前提
rails 5.1.3
ruby 2.4.1
gem active_admin
正規化前
User | 男 | 女 | Gap | NIKE | Supreme |
---|---|---|---|---|---|
User1 | ○ | 1 | 7 | ||
User2 | ○ | 4 | 4 |
正規化後
ruby
1### Model User 2belongs_to :user_sex => 性別が入るSEXモデルも別途あり 3has_many :user_brands => ブランドが入るBrandモデルも別途あり
一覧
ruby
1ActiveAdmin.register User do 2 column :user_name 3 Sex.order('id').each do |sex| 4 column sex.sex_name do |user| 5 "○" if user.user_sex.find_by(sex_id: sex.id) 6 end 7 end 8 Brand.order('id').each do |brand| 9 column brand.brand_name do |user| 10 user.user_brands.find_by(brand_id: brand.id).number if user.user_brands.find_by(brand_id: brand.id) 11 end 12 end 13end 14 15def scoped_collection 16 User.includes(:user_sex, :user_brands) 17 end
問題点 has_manyの子モデルから特定カラムを取得する方法にはSQLが発生する?
性別判定の○は、if user.user_sex.pluck(:sex_id).include?(sex.id)
という記述で、複数のSQLを減らすことが出来ました。
が、UserBrandモデルから個数を取り出す際には、どうしてもSQLが発生してしまいます。
調べた所、where
find
find_by
を使った場合にはSQLが発生してしまうようなので、複数関係のモデルから特定カラムの値を取得する場合にSQLが発生することは致し方がないことなのですか?
よろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/04 04:39