0

我为一件小事而苦苦挣扎,我不知道该怎么做。我有用户和状态表。我想我应该添加 StatusList 表,它将保留所有可用的状态。用户将保留用户数据,但状态将保留当前用户状态。所以它可能看起来像:

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']。所以我开始在谷歌寻找解决这个问题,但我找不到任何东西,所以我在这里问,这种关系应该是什么样子?如果我的想法很好,为什么不能像我预期的那样工作?

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

4

2 回答 2

0

这是你可以设置的

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 的多对多关系设置为“连接模型”,您可以设置为我上面的示例

@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
于 2017-07-11T04:09:18.013 回答
0

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

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

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

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

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

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

于 2017-07-11T05:47:38.010 回答