我使用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
答案 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
希望它有用!