2016-03-23 17 views
0

ボード& BoardThreadモデルレール、ActiveRecord_Associations_CollectionProxyはActiveRecordの

class Board < ActiveRecord::Base 
    has_many :board_threads 
end 

class BoardThread < ActiveRecord::Base 
    belongs_to :board 
    has_many :likes, as: :likable 

    def select_with_likes 
     select("*, (SELECT COUNT(likes.id) FROM likes WHERE likable_id = board_threads.id AND likable_type = 'BoardThread') AS likes_cnt") 
    end 
end 

のメソッドを呼び出すと、私は以下のようにActiveRecord_Associations_CollectionProxyクラスから「select_with_likes」を使用したいのための方法。

b = Board.first 
b.board_threads.select_with_likes.order()... 

これはすばらしい方法ですか。

答えて

1

あなたは、コードにscope

class BoardThread < ActiveRecord::Base 
    belongs_to :board 
    has_many :likes, as: :likable 

    scope :with_likes, -> { 
     select("*, (SELECT COUNT(likes.id) FROM likes WHERE likable_id = board_threads.id AND likable_type = 'BoardThread') AS likes_cnt") 
    } 
end 

board_threads = Board.first.board_threads.with_likes.order(...) 
+0

THXああ!スコープはactiverecordアソシエーションでも使用できます – myggul

0

わずかな変化にロジックを移動することができますので、あなたのような方法に自己のキーワードを追加することです:

def self.select_with_likes 
    select("*, (SELECT COUNT(likes.id) FROM likes WHERE likable_id = board_threads.id AND likable_type = 'BoardThread') AS likes_cnt") 
end 
+0

いいえ、 'Board.first.board_threads'は' BoardThread'クラスではないので、この変更で@ user2880239が望むものを達成することはできません。 – Aetherus

関連する問題