2013-04-23 2 views
0

У меня есть табличный продукт (id, name) и таблица product_raiting (product_id, rate_type, rate). Когда я создаю новый продукт, мне нужно создать три рейда для этого продукта.Как создать триггер postgres в рельсах?

Как я могу добавить 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) 

Пожалуйста, помогите.

ответ

8

Вы хотите создать триггер в базе данных, так что вставить БД выполняет работу?

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(); 

или вы хотите рельсы, чтобы сделать работу? то это будет after_create callback 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 
Смежные вопросы