如何为 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})