0

我有三个模型:

  • 用户

这些协会是:

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

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

在作为 STI 模型的 Trophy 模型中,有一个 trophy_type 列。我想返回一个获得特定奖杯的用户列表——(trophy_type = 'GoldTrophy')。用户可以多次获得同一个奖杯。(我不想要不同的结果。)

我可以使用 named_scope 吗?把它们串起来怎么样?还是我需要使用 find_by_sql?无论哪种方式,我将如何编码?

4

2 回答 2

1

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

将 has_many :users 添加到 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。

于 2010-05-02T17:44:46.233 回答
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
于 2010-05-02T06:55:17.423 回答