Удалить ассоциацию программно в Rails - PullRequest
3 голосов
/ 22 декабря 2009

Я пишу расширение для Spree и хочу удалить существующую ассоциацию.

С учетом следующего кода:

class Project < ActiveRecord::Base
  has_one :status
  ...
end

Как я могу удалить звонок на has_one :status во время выполнения? Я хочу удалить ассоциацию и связанные методы.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2009

Как насчет того, чтобы оставить его и добавлять только тогда, когда это нужно?

Возможно, вам нужна только ассоциация в классе, который используется в методе, предназначенном для выполнения из cronjob или пакета? Затем вы можете набрать код, чтобы ввести ассоциацию.

def need_assoc
  eval <<-EOC
    class Project < ActiveRecord::Base
    has_one :status
    ...
    end
  EOC
end

Причиной использования eval является невозможность оценки ассоциации при загрузке классов.

0 голосов
/ 22 декабря 2009

К сожалению, это довольно сложный вызов DSL, который добавляет в класс множество методов, вам придется удалить все из них, и, вероятно, это того не стоит.

Вероятно, проще создать новый класс CleanProject, добавить к нему объект Project, используя композицию или наследование, а затем передавать вызовы только тем частям Project, которые вам нужны.

С другой стороны, если вы хотите спросить, как удалить статус, связанный с этим проектом (не удалить тот факт, что статусы связаны с проектами, а просто удалить один статус из одного проекта), вы бы просто позвоните:

status.project_id = nil
status.save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...