📜  belongs_to 可选 true (1)

📅  最后修改于: 2023-12-03 14:39:30.830000             🧑  作者: Mango

belongs_to

简介

belongs_to 是 ActiveRecord 提供的一种关联关系,用于表示当前模型属于另一个模型。

语法
belongs_to :association_name, options
参数
  • :association_name:必须,关联模型的名称。
  • :options:可选,关联模型的设置。
可选设置
  • :class_name:指定关联的模型名称。例如,如果关联的模型名不是类名,可以使用该选项指定正确的名称。
  • :foreign_key:指定关联的外键名称。例如,如果外键不是 association_name_id,可以使用该选项指定正确的名称。
  • :primary_key:指定关联的主键名称。例如,如果主键不是 id,可以使用该选项指定正确的名称。
  • :counter_cache:指定关联的计数器名称,以便激活计数器。例如,belongs_to :user, counter_cache: true 将在用户模型上自动增加 articles_count 字段。
  • :optional:设置为 true,表示关联是可选的。默认为 false,即关联必须存在。如果设置了 true,则关联可以为 nil
举例

假设我们有两个模型:用户 (User) 和文章 (Article),每篇文章都属于一个用户。

Article 模型中添加 belongs_to :user 关联:

class Article < ApplicationRecord
  belongs_to :user
end

现在,我们可以使用 user 方法获取该文章所属的用户:

article = Article.first
user = article.user

我们还可以使用 user= 方法设置该文章所属的用户:

user = User.first
article.user = user
可选设置示例

设置关联模型名称

假设我们的外键不是默认的 user_id,而是 author_id,我们可以使用 :foreign_key 选项来指定外键名称:

class Article < ApplicationRecord
  belongs_to :author, foreign_key: "author_id", class_name: "User"
end

设置关联模型主键名称

假设我们的关联模型的主键不是默认的 id,而是 uuid,我们可以使用 :primary_key 选项来指定主键名称:

class User < ApplicationRecord
  self.primary_key = "uuid"
  
  has_many :articles
end

class Article < ApplicationRecord
  belongs_to :user, primary_key: "uuid"
end

设置关联模型计数器

假设我们想要在用户模型上自动增加文章计数器 articles_count,我们可以使用 :counter_cache 选项来激活计数器:

class User < ApplicationRecord
  has_many :articles, counter_cache: true
end

class Article < ApplicationRecord
  belongs_to :user
end

设置关联为可选

假设文章可能不属于任何用户(例如,它是管理员发布的),我们可以使用 :optional 选项来设置关联为可选:

class Article < ApplicationRecord
  belongs_to :user, optional: true
end