如何为可以分配给 1 个或多个级别的 Post 对象建模
How to model a Post object that could be assigned to 1 or more levels
我有一个post模型
class Post < ApplicationRecord
belongs_to :account
end
迁移看起来像:
class CreatePosts < ActiveRecord::Migration[7.0]
def change
create_table :posts do |t|
t.integer :account_id, null: false
t.string :title, null: false
t.string :content, null: false
t.timestamps
end
end
end
现在,当我显示这些 post 的列表时,我只会根据用户的许可显示它们。
class Level< ApplicationRecord
end
class CreateLevels < ActiveRecord::Migration[7.0]
def change
create_table :levels do |t|
t.integer :account_id, null: false
t.string :name, null: false
t.timestamps
end
end
end
假设我有用户权限建模为级别:
Level 1
Level 2
Level 3
因此,每次创建 Post 时,都会将其分配给另外 1 个级别。
当具有级别 2 的用户查看 post 列表时,该用户将仅看到与级别 2 关联的 post。
我猜 table 看起来像:
- post_id
- level_id
- timestamps
所以 Post 可以再多属于 1 个级别,但我认为同一个 post_id 永远不会与系统中的同一个 level_id 相关联。
哪种类型的协会最能在 Rails/ActiveRecord 中对此进行描述?
如果有人可以帮助调整我的迁移并向模型添加适当的关联。
以下是一个稍微隐藏的要求:
So a Post could belong to 1 more more levels, but I don't think the same post_id will ever be associated to the same level_id in the system.
应该可以,所以是必须的。这意味着您将需要多对多关系。在模型上,您将使用 has_and_belongs_to_many
.
可以在这个专门询问多对多关系的 Stack Overflow 问题上找到更多信息:Creating a many to many relationship in Rails
我可能会这样建模:
迁移
create_table :users do |t|
t.string :username, null: false
t.timestamps
end
create_table :posts do |t|
t.references :author, foreign_key: { to_table: :users }
t.string :title, null: false
t.string :content, null: false
t.timestamps
end
create_table :levels do |t|
t.string :name, null: false
t.timestamps
end
create_table :post_levels do |t|
t.references :level
t.references :post
t.timestamps
end
add_reference(:users, :level)
型号
class User
belongs_to :level
has_many :authored_posts, class_name: 'Post', foreign_key: :author_id
has_many :viewable_posts, through: :level, source: :posts
end
class Post
belongs_to :author, class_name: 'User'
has_many :post_levels
has_many :levels, through: :post_levels
end
class Level
has_many :users
has_many :post_levels
has_many :posts, through: :post_levels
end
class PostLevel
belongs_to :level
belongs_to :post
# make sure a post can only belong to a level one time
validates :post_id, uniqueness: {scope: :level_id}
end
我有一个post模型
class Post < ApplicationRecord
belongs_to :account
end
迁移看起来像:
class CreatePosts < ActiveRecord::Migration[7.0]
def change
create_table :posts do |t|
t.integer :account_id, null: false
t.string :title, null: false
t.string :content, null: false
t.timestamps
end
end
end
现在,当我显示这些 post 的列表时,我只会根据用户的许可显示它们。
class Level< ApplicationRecord
end
class CreateLevels < ActiveRecord::Migration[7.0]
def change
create_table :levels do |t|
t.integer :account_id, null: false
t.string :name, null: false
t.timestamps
end
end
end
假设我有用户权限建模为级别:
Level 1
Level 2
Level 3
因此,每次创建 Post 时,都会将其分配给另外 1 个级别。
当具有级别 2 的用户查看 post 列表时,该用户将仅看到与级别 2 关联的 post。
我猜 table 看起来像:
- post_id
- level_id
- timestamps
所以 Post 可以再多属于 1 个级别,但我认为同一个 post_id 永远不会与系统中的同一个 level_id 相关联。
哪种类型的协会最能在 Rails/ActiveRecord 中对此进行描述?
如果有人可以帮助调整我的迁移并向模型添加适当的关联。
以下是一个稍微隐藏的要求:
So a Post could belong to 1 more more levels, but I don't think the same post_id will ever be associated to the same level_id in the system.
应该可以,所以是必须的。这意味着您将需要多对多关系。在模型上,您将使用 has_and_belongs_to_many
.
可以在这个专门询问多对多关系的 Stack Overflow 问题上找到更多信息:Creating a many to many relationship in Rails
我可能会这样建模:
迁移
create_table :users do |t|
t.string :username, null: false
t.timestamps
end
create_table :posts do |t|
t.references :author, foreign_key: { to_table: :users }
t.string :title, null: false
t.string :content, null: false
t.timestamps
end
create_table :levels do |t|
t.string :name, null: false
t.timestamps
end
create_table :post_levels do |t|
t.references :level
t.references :post
t.timestamps
end
add_reference(:users, :level)
型号
class User
belongs_to :level
has_many :authored_posts, class_name: 'Post', foreign_key: :author_id
has_many :viewable_posts, through: :level, source: :posts
end
class Post
belongs_to :author, class_name: 'User'
has_many :post_levels
has_many :levels, through: :post_levels
end
class Level
has_many :users
has_many :post_levels
has_many :posts, through: :post_levels
end
class PostLevel
belongs_to :level
belongs_to :post
# make sure a post can only belong to a level one time
validates :post_id, uniqueness: {scope: :level_id}
end