Rails的after_save回调未触发。

4

我有以下的代码,对于删除记录来说非常有效,但是尝试使用after_save回调将记录插入表中却没有任何反应。

本质上,我正在创建一系列高级关系,应该创建或删除与campaign_category_metro_bids表相关的关系。如果在PHPMyAdmin中运行,则没有问题。但是在Rails中点击并激活只允许调用第二个回调,即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个回答

4

我尝试过了,但没有成功。我正在使用回调函数来处理通过SQL调用创建的表格,而不是使用Active Record。 - Sauron
你能在该模型中获取任何保存/提交后回调函数吗?如果这是通过将地铁加入到广告系列或反之而创建的,则这将是问题所在,我们可以探索解决方案。 - rafb3
我将整个过程移植到使用 Active Record 创建的模型中,现在运行得非常顺利,没有任何问题。 - Sauron
这些模型是否与 has_and_belongs_to_many 相关?如果是的话,您可以尝试使用 has_many :through。http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association - rafb3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接