查找表的Rails关联

use*_*769 3 ruby activerecord ruby-on-rails

我有一个Statuses表,其中只包含一个id和name字段(Active,Inactive,Pending等).然后我有诸如用户,成就,徽章之类的表,其中每个表包含一个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
Run Code Online (Sandbox Code Playgroud)

我正在努力解决如何在查找表的情况下正确读取has_one和has_many之间的区别.我知道一个用户有一个公司,有一个配置文件,一个公司有很多用户,但这似乎是我的倒退.

小智 8

最简单的关联设置是:

class User < ActiveRecord::Base
  has_one :status
end
Run Code Online (Sandbox Code Playgroud)

这准确地描述了您发布的内容.您的解决方案可行,但对于您所描述的内容来说,这样做太过分了.我上面发布的所有关联都是向用户模型添加一个方法,即

@user = User.find(1)
@user.status
Run Code Online (Sandbox Code Playgroud)

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

class Status < ActiveRecord::Base
  has_many :users
end
Run Code Online (Sandbox Code Playgroud)

所以现在你可以这样做:

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

@status.users
Run Code Online (Sandbox Code Playgroud)

请注意,在两种情况下,所需的只是用户模型具有属性"status_id"

当存在隐式层次结构时,Belongs_to更适合,即e,

class Child << ActiveRecord::Base
   belongs_to :parent
end
Run Code Online (Sandbox Code Playgroud)