Ассоциация Has_many / own_to не сохраняется из-за полиморфных ассоциаций? - PullRequest
0 голосов
/ 02 декабря 2009

Я пытаюсь создать журнал атрибутов, которые менялись в каждом обновлении определенного сообщения. Атрибутами являются IssueStatus и IssueType, и оба имеют две полиморфные ассоциации с UpdateAction, что прекрасно сохраняет changed_from_id и changed_from_type, а также changed_to_id и changed_to_type.

class IssueStatus < ActiveRecord::Base
  has_many :update_actions, :as => :changed_to
  has_many :update_actions, :as => :changed_from
end

class IssueType < ActiveRecord::Base
  has_many :update_actions, :as => :changed_to
  has_many :update_actions, :as => :changed_from
end

class Update < ActiveRecord::Base
  has_many :update_actions
end

class UpdateAction < ActiveRecord::Base
  belongs_to :changed_to, :polymorphic => true
  belongs_to :changed_from, :polymorphic => true

  belongs_to :update
end

Проблема в том, что попытка сохранить UpdateAction в Update.update_actions не работает. Rails возвращает true для save и save!, но мой файл development.log не показывает никаких SQL-запросов. Я не могу выяснить, что я делаю неправильно, так как ничего не зарегистрировано (или я не знаю, как это найти). Работа с консоли:

>> action = UpdateAction.new
=> #<UpdateAction id: nil, changed_from_id: nil, changed_from_type: nil, changed_to_id: nil, changed_to_type: nil, update_id: nil, created_at: nil, updated_at: nil>
>> action.changed_from = from
=> #<IssueStatus id: 2, name: "Open", created_at: "2009-12-02 05:34:41", updated_at: "2009-12-02 05:34:41">
>> action.changed_to = to
=> #<IssueStatus id: 1, name: "Closed", created_at: "2009-12-02 05:34:30", updated_at: "2009-12-02 05:34:30">
>> action.save
=> true
>> update = Update.last
=> #<Update id: 1, description: "Yawn", created_at: "2009-12-02 05:19:25", updated_at: "2009-12-02 05:19:25">
>> u.update_actions << action
=> [#<UpdateAction id: 2, changed_from_id: 2, changed_from_type: "IssueStatus", changed_to_id: 1, changed_to_type: "IssueStatus", update_id: 1, created_at: "2009-12-02 05:35:16", updated_at: "2009-12-02 05:35:16">]
>> u.save
=> true
>> u.update_actions
=> [#<UpdateAction id: 2, changed_from_id: 2, changed_from_type: "IssueStatus", changed_to_id: 1, changed_to_type: "IssueStatus", update_id: 1, created_at: "2009-12-02 05:35:16", updated_at: "2009-12-02 05:35:16">]
>> u.reload
=> #<Update id: 1, description: "Yawn", created_at: "2009-12-02 05:19:25", updated_at: "2009-12-02 05:19:25">
>> u.update_actions
=> []

Любая помощь будет принята с благодарностью. Думаю, я делаю что-то не так, но я слишком долго смотрел на нее, чтобы понять, что именно. Заранее спасибо!

1 Ответ

3 голосов
/ 02 декабря 2009

Измените первую строку с

action = UpdateAction.new

до

action = Update.last.update_actions.build

Вот что происходит в вашем примере (при условии, что вы ссылаетесь на реальное u, а не обновляете, как предложил Swanand) - строка u.save ничего не делает, потому что она только сохраняет несохраненные связанные объекты. Вы уже сохранили вырожденное действие, поэтому сохранение связанного объекта в has_many не считает, что есть над чем работать, поскольку поле, которое нужно изменить, находится в связанном объекте. Таким образом, ни где не сохраняется поле действия update_id. Вы также можете вызвать action.save и исправить это.

Я бы использовал validate_presence_of update_id для предотвращения сохранения и добавления ограничения FK в БД для update_actions для update_id.

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