2014-12-23 3 views
2

У меня есть код ниже, который отлично подходит для удаления записи, но при попытке вставить записи в таблицу, используя обратный вызов after_save, ничего не делает.Rails after_save callback not firing

По существу, я создаю серию расширенных отношений, которые должны создавать или удалять отношения из таблицы campaign_category_metro_bids. Если я запускаю PHPMyAdmin, проблем нет. Но веб и активируя в рельсах позволяет только для второго обратного вызова, after_destroy быть называется ...

class CampaignMetro < ActiveRecord::Base 

    belongs_to :campaign 
    belongs_to :metro 

    after_destroy :destroy_category_campaign_metro_bid 
    after_save :create_category_campaign_metro_bid 

    def create_category_campaign_metro_bid 
     insert = "INSERT INTO campaign_category_metro_bids (campaign_id,category_id, metro_id, created_at, updated_at) 
        SELECT e.campaign_id, e.category_id, e.metro_id, NOW(), NOW() 
        FROM 
        (SELECT c.campaign_id, c.category_id, c.metro_id 
        FROM (SELECT a.campaign_id, a.category_id, b.metro_id 
          FROM campaign_categories a 
          cross join campaign_metros b 
          ON a.campaign_id = b.campaign_id) c) e 
        LEFT JOIN campaign_category_metro_bids d 
        ON d.campaign_id = e.campaign_id and 
         d.category_id = e.category_id and 
         d.metro_id = e.metro_id 
        WHERE d.campaign_id is null and 
          d.category_id is null and 
          d.metro_id is null;" 

     ActiveRecord::Base.connection.execute(insert) 
    end 

    def destroy_category_campaign_metro_bid 
     delete="DELETE d.* 
       FROM campaign_category_metro_bids d 
       LEFT JOIN 
       (SELECT c.campaign_id, c.category_id, c.metro_id 
       FROM (SELECT a.campaign_id, a.category_id, b.metro_id 
         FROM campaign_categories a 
         cross join campaign_metros b 
         ON a.campaign_id = b.campaign_id) c) e 
       ON d.campaign_id = e.campaign_id and 
        d.category_id = e.category_id and 
        d.metro_id = e.metro_id 
       WHERE e.campaign_id is null and 
         e.category_id is null and 
         e.metro_id is null;" 

     ActiveRecord::Base.connection.execute(delete) 
    end 
end 

Как я могу получить эту работу?

ответ

1

Проблема в том, что на after_save транзакция, которая создаст запись в базе данных, еще не была выполнена, поэтому запись еще не наступила. Вы должны использовать after_commit.

http://apidock.com/rails/ActiveRecord/Transactions/ClassMethods/after_commit

+0

Я пробовал, что это не сработало. Я использую обратные вызовы в таблице, которая создается через вызовы SQL, а не активная запись. – Sauron

+0

Можете ли вы получить какой-либо запрос на сохранение/фиксацию вообще для запуска в этой модели? Если это будет создано неявно, добавив метро в кампанию или наоборот, тогда это будет проблемой, и мы сможем изучить решения для этого – rafb3

+0

. Я переместил весь процесс в модель, которая создается с активной записью, и работает точно так же, как это должен. Нет проблем – Sauron