0

Есть проблемы в отношении сохранения ActiveRecord ассоциаций и нужна ваша помощь :)Rails: ActiveRecord ассоциации сохранение проблемы

Мне нужно добавлять статьи сливающихся функциональность унаследованного кода.

Он должен работать следующим образом: текст

  1. Merge статья «источник» в к «цели» статьи.
  2. Проверьте комментарии «источника» и, если таковые имеются, повторно привяжите их к «цели».
  3. Уничтожьте статью «источник». Комментарии должны быть сохранены и связаны с «мишенью».

Код модели моей статьи (уменьшен для удобства чтения).

class Article < Content 

    before_destroy :reload_associated_comments 

    has_many :comments, :dependent => :destroy, :order => "created_at ASC" do 

    def reload_associated_comments 
    unless self.comments.empty? 
     article = Article.find(@merge_with) 
     self.comments.each do |comment| 
     comment.article = article 
     article.save! 
     end 
    end 
    end 

    def merge_with(id) 
    @merge_with = id 
    article = Article.find(@merge_with) 
    if !article.nil? 
     text = article.body + body 
     article.body = text 
     article.save! 
     self.destroy 
     return article 
    end 
    nil 
    end 
end 

Вот комментарий модель (также снижается):

class Comment < Feedback 
    belongs_to :article 
end 

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

eval Article.find(target_article_id).comments 

Save не исключает никаких исключений. Что мне здесь не хватает?

Заранее благодарен!

Это работал для меня

def merge_with(id) 
    @merge_with = id 
    article = Article.find(@merge_with) 
    unless article.nil? 
     text = article.body + body 
     article.body = text 
     article.save! 
     reload_associated_comments 
     self.reload 
     self.destroy 
     return article 
    end 
    nil 
    end 
+0

В этом способе reload_associated_comments он должен быть comment.save! вместо article.save! Я думаю :) – Zippie

+0

также я не уверен, но я думаю, вы не можете назвать self.destroy внутри метода, который называется self. Верните статью, а затем уничтожьте ее извне (где вы вызываете метод 'merge_with'). – Zippie

+0

Метод' reload_associated_comments' используется как обратный вызов 'before_destroy'. Если я вызываю article.save !, разве это не означает, что комментарии сохраняются автоматически? Если это не так, то каков правильный порядок сохранения. Комментарий, а затем статью или наоборот? – niebelung

ответ

1

На самом деле Rails уничтожить каждый комментарий перед вызовом before_destroy обратного вызова для статьи. К сожалению, как работают рельсы. Изменение этого поведения подразумевает использование устаревших приложений. Вы можете найти более подробную информацию по этому вопросу здесь: https://github.com/rails/rails/issues/670

На мой взгляд, наилучшим решением будет переопределить метод destroy и избавиться от обратного вызова:

class Article < Content 

    def destroy 
    reload_associated_comments 
    super 
    end 

    has_many :comments, :dependent => :destroy, :order => "created_at ASC" do 

    def reload_associated_comments 
    unless self.comments.empty? 
     article = Article.find(@merge_with) 
     self.comments.each do |comment| 
     comment.article = article 
     comment.save! 
     end 
    end 
    end 

    def merge_with(id) 
    @merge_with = id 
    article = Article.find(@merge_with) 
    if !article.nil? 
     text = article.body + body 
     article.body = text 
     article.save! 
     self.destroy 
     return article 
    end 
    nil 
    end 
end 

Кроме того, как уже упоминалось @Zippie, вы должны по телефону comment.save! вместо article.save!

Надеюсь, это поможет!

+1

wow, какой ответ! alfonso, не могли бы вы сказать, что 'article.save!' в методе 'reload_associated_comments' является неправильным? Не должно быть 'comment.save'! И если это правильно, как правильно? Когда мы помещаем '.save!' На объект, он воздействует на всех его детей? – Zippie

+0

@ Zippie хороший catch! Да, ты прав. Редактирование моего ответа ... – alf

+0

Я действительно рад, потому что, если бы я не был, ActiveRecord вывел бы меня из себя! :) – Zippie

Смежные вопросы