我有以下使用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
希望对你有帮助!