我有三种模式:
协会是:
因此,user_id是奖励中的fk,而trophy_id是奖励中的fk。
在Trophy模型中,这是一个STI模型,有一个trophy_type列。我想返回一个被授予特定奖杯的用户列表 - (trophy_type ='GoldTrophy')。用户可以多次获得相同的奖杯。 (我不希望得到明显的结果。)
我可以使用named_scope吗?链接他们怎么样?或者我需要使用find_by_sql吗?无论哪种方式,我将如何编码?
答案 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