Rails ActiveRails加入 - 表名为复数/单数

时间:2018-03-25 22:13:41

标签: ruby-on-rails database join activerecord

我使用ActiveRecord进行以下“查询”:

Product.joins(product_attr_vals: [attr_val: [:attr]])
       .joins(:product_model)
       .where(product_models: {id: @product_model.id}, attrs: {id: attr.id})
       .distinct
       .count

我无法理解为什么有时候在joins()中,rails会以复数形式接受表名,而其他人则以单数形式接受。

  • product_attr_vals: (如果是单数,则无效 - > product_attr_val)
  • attr_val:
  • :attr
  • :product_model

一些信息:

模型/ product_model_attr_val.rb

class ProductModelAttrVal < ApplicationRecord
  validates :product_model_id, uniqueness: { scope: :attr_val_id }

  belongs_to :product_model
  belongs_to :attr_val
end

分贝/迁移/ db_creation.rb

create_table :product_model_attr_vals do |t|
  t.references :product_model, null: false, foreign_key: true
  t.references :attr_val, null: false, foreign_key: true

  t.timestamps
end

1 个答案:

答案 0 :(得分:3)

何时使用单数或复数的答案在于关联的名称。通常has_many个关联以复数形式命名,而belongs_to个关联以单数形式命名。在构建查询的幕后,ActiveRecord将确保始终使用正确的表名(复数)。在Rails中,存在“约定优于配置”的概念,这意味着许多东西都有预定义的方法,可以开箱即用。例如。采取协会belongs_to :product。 ActiveRecord将在表product_id中查找列products并使用它来加载产品。另一个例子是has_many :products - ActiveRecord将查找名为products的表,并假设它有一列your_model_id。因此,它将为您的模型实例加载所有产品。

回到你的问题,何时使用单数或复数。如果您不确定,请检查相应型号中的关联定义。通常,has_many关联使用复数,belongs_to关联使用单数。以下是两个模型的示例:

class Employee
  has_many :tasks
end

class Task
  belongs_to :employee
end

以下是一些joins示例:

Employee.joins(:tasks) # plural due to has_many 
Task.joins(:employee) # singular due to belongs_to

希望它有用!