我有以下使用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:(如果是单数->乘积属性值,则不起作用)
attr_val:
:attr
:product_model
一些信息:
型号/产品型号
class ProductModelAttrVal < ApplicationRecord
  validates :product_model_id, uniqueness: { scope: :attr_val_id }

  belongs_to :product_model
  belongs_to :attr_val
end

db/migrate/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

最佳答案

何时使用单数或复数取决于协会的名称。通常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

下面是一些例子:
Employee.joins(:tasks) # plural due to has_many
Task.joins(:employee) # singular due to belongs_to

希望对你有帮助!

10-01 07:17