Как вы пишете поисковый запрос Rails для отношения has_many? - PullRequest
1 голос
/ 04 октября 2019

Я использую Rails 5. У меня есть следующий класс

class ParentObject < ApplicationRecord
    has_and_belongs_to_many :child_objects, :optional => false
end

У меня есть параметр params[:child_objects], переданный моему контроллеру, который является массивом идентификаторов этих объектов. Как я могу написать искатель для возврата объектов, привязанных к этим идентификаторам? Я попробовал это

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

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Вы можете найти эти регистры с помощью этого запроса ниже

ParentObject.joins(:child_objects).where('child_objects.id in (?)', child_objects)

где ('child_objects.id in (?)', Child_objects) # вы ищете идентификаторы в таблице child_objects. Укажите таблицу соединений child_objects.id

Это тот же запрос, но больше RailsWay. Та же идея

ParentObject.joins(:child_objects).where(child_objects: { id: child_objects} )
0 голосов
/ 04 октября 2019

Исходя из определенных классов, has_and_belongs_to_many означает, что родитель может иметь много детей, а ребенок может принадлежать многим родителям. Это соответствует соотношению «многие ко многим» и, следовательно, требует ассоциативной (или соединительной) таблицы.

Для определенных выше классов rails будет искать child_objects_parent_objects и выдает ошибку, если таблица не присутствует. Добавьте соединительную таблицу, как определено ниже

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;

И затем приведенный ниже запрос вернет родительские объекты для данных дочерних объектов (params[:child_objects]).

ParentObject.joins(:child_objects).where(child_objects: { id: child_object_ids})

Однако, если вы хотите, чтобы дочерний элемент принадлежал только одному родителю, определить таблицу отношений и соединений has_many не потребуется.

class ParentObject < ApplicationRecord
  has_many :child_objects
end

ParentObject.joins(:child_objects).where(child_objects: { id: child_object_ids})
...