#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. Спасибо большое. нужно прочитать что-то вроде вложенных объединений, как в ваших примерах 🙂 Спасибо большое. Это идеальная работа 🙂