2016-03-23 13 views
0

Kurulu & BoardThread modeliRaylar, 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 

yöntemi çağırmak Ve aşağıda gibi ActiveRecord_Associations_CollectionProxy sınıfından 'select_with_likes' kullanmak istediğiniz için yol.

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

Bunun için harika bir yol nedir?

cevap

1

Sen koduna 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

ah thx !! kapsamı activerecord dernek de kullanılabilir, – myggul

0

hafif değişim içine mantığı hareket böylece gibi yöntemine kendine anahtar kelime eklemektir:

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

Hayır, bu değişiklik ile @ user2880239 istediğini elde edemezsiniz, çünkü 'Board.first.board_threads' 'BoardThread 'sınıfı değil. – Aetherus

İlgili konular