2012-05-28 31 views
3

我有一个只包含一个id和名称字段(活动,不活动,待定等)作以下状态表。然后我有表格,例如Users,Achievements,Badges,其中每个表都包含一个status_id外键。我的模型中的关联是否正确?的Rails协会的查找表

class Status < ActiveRecord::Base 
    has_many :achievements 
    has_many :badges 
    has_many :users 
end 

class User < ActiveRecord::Base 
    belongs_to :status 
end 

class Badge < ActiveRecord::Base 
    belongs_to :status 
end 

class Achievement < ActiveRecord::Base 
    belongs_to :status 
end 

我在如何在查找表的情况下正确地读取has_one和has_many之间的差异而苦苦挣扎。我知道一个用户有一个公司,有一个配置文件,一个公司有很多用户,但这对我来说似乎倒退了。

回答

8

最简单的关联安装将是:

class User < ActiveRecord::Base 
    has_one :status 
end 

恰好说明您已发布的内容。你的解决方案可以工作,但对于你所描述的内容来说这太过于夸张了。所有我上面贴会做该协会是一个方法添加到用户模型,即

@user = User.find(1) 
@user.status 

如果在另一方面,你想简单的语义显示具有特定状态的所有用户,那么你最好添加

class Status < ActiveRecord::Base 
    has_many :users 
end 

所以现在你可以这样做:

@status = Status.find_by_description('Active').first() 

@status.users 

注意,在这两种情况下,所有需要的是用户模型有一个属性“STATUS_ID”

belongs_to的是更适合当有一个隐含的层次结构,I,E,

class Child << ActiveRecord::Base 
    belongs_to :parent 
end 
+0

感谢详细的解答。关于belongs_to ...我没看过rails网站上的一些文档,说包含外键的表包含模型中的belongs_to。 – user1084769

+1

这是真的,但问题是你需要belongs_to引入的语义吗?即用户有一个状态,但状态属于用户?没有状态不属于用户,可以将状态分配给多个用户,因此您可能永远不需要查询语义,即向我显示属于此状态的用户。 – RadBrad

+0

这实际上是解释它的一个非常好的方法。非常感谢! – user1084769