rails active record: обновить таблицу с объединением - PullRequest
7 голосов
/ 20 марта 2012

Я работаю над проектом рельсов. У меня есть две таблицы, хранящие данные из разных систем: задачи и проекты.

С условием Projects знает Задачи через ref_id, но не в обратном направлении. поэтому, как только совпадения найдены в объединении, я бы хотел установить task.project_id с идентификатором соответствующей таблицы Projects.

UPDATE FROM task AS t
LEFT JOIN projects as p
ON t.ref_id = p.ref_id
SET t.project_id = p.id

мой вопрос здесь: как я могу добиться этого, используя активную запись в рельсах?

Ответы [ 3 ]

1 голос
/ 24 января 2017

Если вы используете postgres, вы можете запустить update_all с «объединением» из модели, например:

Task.connection.update_sql("UPDATE tasks AS t SET project_id = p.id FROM projects AS p WHERE t.ref_id = p.ref_id")

Примечание: вызов update_sql устарелдля Rails 5 и должен быть переключен на update

Поскольку вы отправляете sql напрямую, вам нужно убедиться, что вы используете синтаксис, подходящий для вашей базы данных.

0 голосов
/ 20 марта 2012

Task.joins (: проект) .update_all ( "tasks.project_id = projects.id")

0 голосов
/ 20 марта 2012

Вы можете сделать это, передав свой sql напрямую

Task.connection.update_sql("UPDATE FROM task AS t LEFT JOIN projects as p ON t.ref_id = #{p.ref_id} SET t.project_id = #{p.id}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...