named_scope或find_by_sql?

时间:2010-05-02 04:56:24

标签: sql ruby-on-rails associations named-scope

我有三种模式:

  • 用户

协会是:

  • 用户有很多奖项
  • 奖杯有很多奖项
  • 奖励属于用户
  • 奖项属于奖杯
  • 用户通过奖励获得许多奖杯

因此,user_id是奖励中的fk,而trophy_id是奖励中的fk。

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

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

2 个答案:

答案 0 :(得分:1)

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

将一个has_many:用户添加到Trophy,例如:

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。

答案 1 :(得分: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