Rails关联查询表的关系

3

我有一个状态表,仅包含id和名称字段(如Active,Inactive,Pending等)。然后我有诸如Users,Achievements,Badges之类的表,每个表都包含status_id外键。我的模型关联是否正确?

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之间的区别方面感到困惑。我知道一个用户有一个公司和一个个人资料,而一个公司有很多用户,但这似乎与我的直觉相反。

1个回答

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更加适合使用。也就是说,
class Child << ActiveRecord::Base
   belongs_to :parent
end

感谢您提供详细的答案。关于belongs_to...,我确实阅读了Rails网站上的一些文档,其中提到包含外键的表在模型中包含belongs_to。 - user1084769
1
这是正确的,但问题是您是否需要belongs_to引入的语义?即一个用户有一个状态,但一个状态是否属于用户?不,状态不属于用户,可以分配给多个用户,因此您可能永远不需要查询语义,指示显示属于此状态的用户。 - RadBrad
那是一个非常好的解释方式。非常感谢! - user1084769

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接