【问题标题】:How create postgres trigger in rails?如何在 Rails 中创建 postgres 触发器?
【发布时间】:2013-04-23 18:09:33
【问题描述】:

我有一个表 product(id,name) 和表 product_raiting(product_id,rate_type,rate)。 当我创建新产品时,我需要为这个产品创建三个等级。

如何添加 postgres 触发器并执行以下操作:



    product.create
    product.product_raitings.create( :rate_type => 0, :rate => 0 )
    product.product_raitings.create( :rate_type => 1, :rate => 0 )
    product.product_raitings.create( :rate_type => 2, :rate => 0 )
    product.product_raitings.create( :rate_type => 3, :rate => 0 )

请帮忙。

【问题讨论】:

    标签: ruby-on-rails postgresql triggers pg


    【解决方案1】:

    您想在数据库中创建一个触发器,以便插入数据库来完成工作吗?

    http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html

    CREATE FUNCTION addRaitings() RETURNS TRIGGER AS '
       BEGIN
          INSERT INTO product_raitings(product_id,rate_type,rate) values(NEW.id,0,0);
          INSERT INTO product_raitings(product_id,rate_type,rate) values(NEW.id,1,0);
          INSERT INTO product_raitings(product_id,rate_type,rate) values(NEW.id,2,0);
          INSERT INTO product_raitings(product_id,rate_type,rate) values(NEW.id,3,0);
       END;
       ' LANGUAGE plpgsql;
    
    CREATE TRIGGER createRaitingTrigger
            AFTER INSERT ON products
            FOR EACH ROW
            EXECUTE PROCEDURE addRaitings();
    

    或者你想让 rails 来完成这项工作?那么这将是一个after_create 回调 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

    所以也许是这样的。

    class Product < ActiveRecord::Base
      has_many product_raitings
    
      after_create :build_default_raitings
    
     private
     def build_default_raitings
        (0..3).each { |x| self.product_raitings.create(:rate_type => x, :rate => 0) }
     end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 2015-10-14
      相关资源
      最近更新 更多