2010-05-02 53 views
0

我有三个型号:named_scope或find_by_sql?

  • 用户
  • 奖杯

的关联是:

  • 用户拥有众多奖项
  • 奖杯有许多奖项
  • 奖属于用户
  • 奖属于奖杯
  • 用户已经通过奖励

许多奖杯因此,user_id是在奖励FK,和trophy_id是在奖励FK。

在Trophy模型中,这是一个STI模型,它有一个trophy_type列。我想返回已经获得特定奖杯的用户列表 - (trophy_type ='GoldTrophy')。用户可以多次被授予同一奖杯。 (我不想要明显的结果。)

我可以使用named_scope吗?如何链接他们?或者我需要使用find_by_sql?无论哪种方式,我将如何编码?

回答

0

我总是用 “的find_by_sql” 舒服你可以用它 使用的find_by_sql如下

User.find_by_sql("select u.id, u.name, t.trophy_type 
        from users u, awards a, trophies t 
        where a.user_id=u.id and 
        t.trophy_id=a.id and 
        t.trophy_type = 'GoldTrophy'" 
       ) 

我不知道用 “named_scope” 可是试试这个

class User < ActiveRecord::Base 

    named_scope :gold_trophy_holder, 
       :select=>" users.id, users.name, trophies.trophy_type",  
       :joins => :awards, "LEFT JOIN awards ON awards.id = trophies.award_id" 
       :conditions => ['trophies.trophy_type = ?', 'GoldTrophy'] 

end 
1

如果您想沿着named_scope路线走,您可以执行以下操作:

添加的has_many:用户奖杯,如:

has_many :users, :through => :awards 

而下面named_scope:

named_scope :gold, :conditions => { :trophy_type => 'GoldTrophy' } 

您可以拨打以下:

Trophy.gold.first.users 

你需要调用“ .first',因为named_scope将返回一个集合。不理想。也就是说,就你而言,使用find_by_sql或named_scope可能是完全合适的。如何使用良好的旧版本:

Trophy.find_by_trophy_type('GoldTrophy').users 

这将完全按照您的要求进行,而无需深入研究SQL。