Rails。将列表保存在数据库中是个好主意吗?我应该使用什么关系?

Rails. Keeping list in database is it good idea? What relation I should use?

我正在为一件小事苦苦挣扎,但我不确定我应该怎么做。 我有用户和状态 table。我在想我应该添加 StatusList table 以保留所有可用状态。 User 将保留用户数据,但 Status 将保留当前用户状态。所以它可能看起来像:

Table User id, name, email
Table Status user_id, status_list_id
Table StatusList id, name

我在想这样的关联:

User
  has_one :status
  has_one :status_list, through: :status

Status
  belongs_to :user
  has_one :status_list

StatusList
  belongs_to :status

但这并不像我预期的那样有效。我的意思是当我尝试做:

@u = User.last
@u.status # => "id: 1"
@u.status.status_list # => No such column "status_lists"

但是当我检查 ActiveRecord::Base.connection.tables 时,我看到了 ['users'、'statuses'、'status_lists']。所以我开始在 google 中寻找解决该问题的方法,但我找不到任何东西,所以我在这里问,这个关系应该是什么样子?如果我的想法很好,为什么没有像我预期的那样工作?

感谢任何帮助我找到解决方案的提示。

这里是你可以设置的

User
  # -> status_lists -> statuses
  has_many :status_lists, :dependent => :destroy
  accepts_nested_attributes_for :status_lists,   :allow_destroy => :true  
  has_many :statuses, through: :status_lists

StatusList
  belongs_to :user
  belongs_to :status

Status
  # -> status_lists -> users
  has_many :status_lists, :dependent => :destroy
  accepts_nested_attributes_for :status_lists,   :allow_destroy => :true  
  has_many :users, through: :status_lists

如果你想用 StatusList 设置多对多关系作为 "connection model" ,你可以像我上面的示例那样设置

@user = User.last
@user.statuses # this will show all the user statuses
@status = Status.last
@status.users # this will show you all user that has same status

如果您想在操作状态时拥有高度的自由度,这是正确的解决方案,也许管理员可以随时从管理控制台更改它们,甚至用户可以自己创建新状态。在那种情况下使用以下内容:

User      
  has_one :status_list, dependent: :destroy
  has_one :status, through: :status_list

StatusList
  belongs_to :user
  belongs_to :status

Status
  has_many :status_lists, dependent: :destroy
  has_many :users, through: :status_lists

如果这不是您的情况,并且您只有一组不会经常更改(它们仍然可以)的受限状态,并且无论如何这都意味着管理新状态的新发展,那么您应该让它更简单,删除状态 tables,并使用 Rails (http://api.rubyonrails.org/v5.1.1/classes/ActiveRecord/Enum.html).

中的 enums

将您的用户 table 更改为具有 status 字符串列并在用户模型中定义状态列表:

enum status: [ active: 'active', archived; 'archived' ]

我强烈建议您使用字符串而不是整数来定义枚举作为数据库中的值,因为它更容易在将来维护和更改。