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' ]
我强烈建议您使用字符串而不是整数来定义枚举作为数据库中的值,因为它更容易在将来维护和更改。
我正在为一件小事苦苦挣扎,但我不确定我应该怎么做。 我有用户和状态 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' ]
我强烈建议您使用字符串而不是整数来定义枚举作为数据库中的值,因为它更容易在将来维护和更改。