我有两个名为User和Post的模型
User.rb
iMessageDataKit
Post.rb
class User < ApplicationRecord
has_many :posts
end
截至目前,用户可以创建,更新,删除特定帖子。
我正在尝试深入学习Active Record,如果帖子的创建者希望与许多用户共享帖子,我希望多个用户访问一个帖子。
所以我打算在发布模型中添加名为 admin 和主持人的列,管理员将保留已创建的用户的ID帖子和主持人将使用逗号分隔的用户与共享帖子的用户。
是否可以通过Active Record Association实现此目标,如果可能,我可以使用哪种关联?
我试图通过现实生活中的例子来理解Active Record Associations,因为在文档中它并不是很清楚。
我是Rails的新手,我正在使用Rails 5。
答案 0 :(得分:2)
admin将保留已创建帖子的用户的ID,主持人将使用逗号分隔的用户与共享帖子的用户。
这是实现这个的错误方法。 任何时候您决定在SQL列中存储以逗号分隔的任何列表,您可能错误地设计了数据库。
是否可以通过Active Record Association实现此目的,如果 可以使用哪种关联?
是的,这是ActiveRecord非常典型的用例。您需要多对多关联,这可以通过has_many :through
或has_and_belongs_to_many
轻松实现。在这种情况下,has_many :through
将是最佳选择,因为您可以为关系添加其他属性(例如“版主”或“管理员”权限)。
您的用户应通过类似PostPermissions
模式的内容加入帖子:
class User < ApplicationRecord
has_many :post_permissions
has_many :posts, through: :post_permissions
end
class Post < ApplicationRecord
has_many :post_permissions
has_many :users, through: :post_permissions
end
class PostPermission < ApplicationRecord
belongs_to :post
belongs_to :user
# Permissions can be stored in any number of ways,
# an `enum` is one simple approach
enum permission: { :moderator, :admin }
end
有关详细信息,请查看ActiveRecord Association指南的has_many :through section。