如何为 has_many 关系编写 Rails 查找器查询?
How do you write a Rails finder query for a has_many relation?
我正在使用 Rails 5. 我有以下 class
class ParentObject < ApplicationRecord
has_and_belongs_to_many :child_objects, :optional => false
end
我有一个参数 params[:child_objects]
传递到我的控制器,它是这些对象 ID 的数组。如何将查找器写入与这些 ID 绑定的 return 个对象?我试过这个
parent_objects = ParentObject.joins(:child_objects).where(
:child_objects => child_objects
)
但是遇到这个错误
Unknown primary key for table parent_objects_child_objects in model ParentObject::HABTM_ChildObjects
您可以通过下面的查询找到这些寄存器
ParentObject.joins(:child_objects).where('child_objects.id in (?)', child_objects)
where('child_objects.id in (?)', child_objects) # you are searching ids into child_objects table. Specify the join table child_objects.id
这是相同的查询,但更多的是 RailsWay。同样的想法
ParentObject.joins(:child_objects).where(child_objects: { id: child_objects} )
基于类的定义,has_and_belongs_to_many
表示一个parent可以有多个children,以及一个child,可以属于许多 parent。这符合多对多关系,因此需要关联(或连接)table。
对于 above-defined 类,rails 将查找 child_objects_parent_objects
并在 table 不存在时引发错误。添加一个交汇点 table,定义如下
CREATE TABLE `child_objects_parent_objects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_object_id` int(11) NOT NULL,
`child_object_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
然后下面的查询将 return parent objects 对于给定的 child objects( params[:child_objects]
).
ParentObject.joins(:child_objects).where(child_objects: { id: child_object_ids})
但是,如果您希望 child 仅属于 1 个 parent,则定义 has_many
关系,不需要连接 table。
class ParentObject < ApplicationRecord
has_many :child_objects
end
ParentObject.joins(:child_objects).where(child_objects: { id: child_object_ids})
我正在使用 Rails 5. 我有以下 class
class ParentObject < ApplicationRecord
has_and_belongs_to_many :child_objects, :optional => false
end
我有一个参数 params[:child_objects]
传递到我的控制器,它是这些对象 ID 的数组。如何将查找器写入与这些 ID 绑定的 return 个对象?我试过这个
parent_objects = ParentObject.joins(:child_objects).where(
:child_objects => child_objects
)
但是遇到这个错误
Unknown primary key for table parent_objects_child_objects in model ParentObject::HABTM_ChildObjects
您可以通过下面的查询找到这些寄存器
ParentObject.joins(:child_objects).where('child_objects.id in (?)', child_objects)
where('child_objects.id in (?)', child_objects) # you are searching ids into child_objects table. Specify the join table
child_objects.id
这是相同的查询,但更多的是 RailsWay。同样的想法
ParentObject.joins(:child_objects).where(child_objects: { id: child_objects} )
基于类的定义,has_and_belongs_to_many
表示一个parent可以有多个children,以及一个child,可以属于许多 parent。这符合多对多关系,因此需要关联(或连接)table。
对于 above-defined 类,rails 将查找 child_objects_parent_objects
并在 table 不存在时引发错误。添加一个交汇点 table,定义如下
CREATE TABLE `child_objects_parent_objects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_object_id` int(11) NOT NULL,
`child_object_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
然后下面的查询将 return parent objects 对于给定的 child objects( params[:child_objects]
).
ParentObject.joins(:child_objects).where(child_objects: { id: child_object_ids})
但是,如果您希望 child 仅属于 1 个 parent,则定义 has_many
关系,不需要连接 table。
class ParentObject < ApplicationRecord
has_many :child_objects
end
ParentObject.joins(:child_objects).where(child_objects: { id: child_object_ids})