запрос rails 5 left_joins с несколькими вложенными моделями

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я не понимаю, как написать хороший запрос. Я попробовал что-то вроде :

 Users.where(id: params[:ids]).left_joins(:worker)
    .where(worker: { worker: { leader_id: nil } }).destroy_all
  

и

 User.left_joins(:worker).where(worker: {Worker.left_joins(:crews).where(crews: { crews: {leader_id: nil}})})
  

но это не сработало: ( и я не знаю, что делать

Вот мои ассоциации:

User.rb

 has_one :worker, dependent: :destroy
  

Worker.rb

 has_many :crews, foreign_key: 'leader_id', dependent: :destroy
  

Crew.rb

   has_many :workers, through: :crew_workers
  

crews_schema:

 create_table "crews", force: :cascade do |t|
      t.integer "leader_id"
end
  

Помогите мне, пожалуйста. Спасибо!

Комментарии:

1. Может помочь, если вы добавите какие-либо полученные ошибки или каково ожидаемое поведение?

2. Я ожидал уничтожить всех пользователей. кто не является leader_id. Как это работает здесь: def уничтожает, если @user.workeramp;.crewsamp;.any? визуализирует json: { сообщение: ‘У этого пользователя есть команда с привязанным к ней назначением’ }, статус: :необработанный идентификатор else @user.destroy head :no_content end завершение

Ответ №1:

Попробуйте следующее:

 Users.where(id: params[:ids]).left_joins(:worker)
# pluralised here:
     .where(workers: { leader_id: nil }).destroy_all
#                ^^^
  

Аргумент, передаваемый в left_joins , отражает ассоциацию (т. Е. :worker ), хотя для where предложения требуется имя таблицы (обычно workers во множественном числе), что может привести к прерыванию выполнения запросов, подобных этому.

У вас также есть дополнительный хэш, обертывающий этот запрос.

И:

 User.left_joins(worker: :crews)
    .where(workers: { crews: { leader_id: nil } })
  

Для последнего вы также можете вложить соединения, например one: { two: { three: :four } } , и увеличить число имен таблиц.

Дайте мне знать, как у вас с этим / если у вас есть какие-либо вопросы.

Комментарии:

1. Спасибо большое. нужно прочитать что-то вроде вложенных объединений, как в ваших примерах 🙂 Спасибо большое. Это идеальная работа 🙂