2010-10-12 114 views
0

我想使用活动记录存储两个模型,但删除不能按预期工作。ActiveRecord STI删除无法正常工作

  1. 评估有ID,名称和描述
  2. 和SqlEvaluation具有QUERY_STRING和数据库的额外的两列。

我想要使用这两个表,并且eval_typ_id用于区分应该使用哪个子类:1用于SqlEvaluation。

create table eval (
eval_id int, 
eval_name varchar, 
eval_desc varchar, 
eval_typ_id int 
); 

create table sql_eval (
eval_id int 
query_str varchar 
database varchar 
); 

经过一番研究,我用下面的代码,它工作得很好,除了“删除”,这并没有sql_eval删除行。我无法弄清楚哪里错了?

require 'rubygems' 
require 'active_record' 
require 'logger' 

ActiveRecord::Base.logger = Logger.new(STDOUT) 
ActiveRecord::Base.establish_connection(:adapter => "ibm_db", 
             :username => "edwdq", 
             :password => "edw%2dqr", 
             :database => "EDWV2", 
             :schema => "EDWDQ") 

class Eval < ActiveRecord::Base 
    set_table_name "eval" 
    set_primary_key :eval_id 


    TYPE_MAP = { 1 => 'SqlEval' } 

    class << self 
    def find_sti_class(type) 
     puts "#{type}" 
     super(TYPE_MAP[type.to_i]) 
    end 


    def sti_name 
     TYPE_MAP.invert[self.name] 
    end 
    end 

    set_inheritance_column :eval_typ_id 
end 

class SqlEval < Eval 
    has_one :details, :class_name=>'SqlEvalDetails', :primary_key=>:eval_id, :foreign_key=>:eval_id, :include=>true, :dependent=>:delete 
    default_scope :conditions => { :eval_typ_id => 1 } 
end 

class SqlEvalDetails < ActiveRecord::Base 
    belongs_to :sql_eval, :class_name=>'SqlEval', 
    :conditions => { :eval_type_id => 1 } 
    set_table_name "sql_eval" 
    set_primary_key :eval_id 
end 

se = SqlEval.find(:last) 

require 'pp' 

pp se 
pp se.details 

# Eval.delete(se.eval_id) 
se.delete 

回答

0

不好意思搞乱了代码。这是第一次为我发帖。这是代码。

require 'rubygems' 
require 'active_record' 
require 'logger' 

ActiveRecord::Base.logger = Logger.new(STDOUT) 
ActiveRecord::Base.establish_connection(:adapter => "ibm_db", 
            :username => "edwdq", 
            :password => "edw%2dqr", 
            :database => "EDWV2", 
            :schema => "EDWDQ") 

class Eval < ActiveRecord::Base 
    set_table_name "eval" 
    set_primary_key :eval_id 


    TYPE_MAP = { 1 => 'SqlEval' } 

    class << self 
    def find_sti_class(type) 
     puts "#{type}" 
     super(TYPE_MAP[type.to_i]) 
    end 

    def sti_name 
     TYPE_MAP.invert[self.name] 
    end 
    end 

    set_inheritance_column :eval_typ_id 
end 

class SqlEval < Eval 
    has_one :details, :class_name=>'SqlEvalDetails', :primary_key=>:eval_id,  :foreign_key=>:eval_id, :include=>true, :dependent=>:delete 
    default_scope :conditions => { :eval_typ_id => 1 } 
end 

class SqlEvalDetails < ActiveRecord::Base 
    belongs_to :sql_eval, :class_name=>'SqlEval', 
    :conditions => { :eval_type_id => 1 } 
    set_table_name "sql_eval" 
    set_primary_key :eval_id 
end 

se = SqlEval.find(:last) 
e = Eval.where(:eval_id => 26) 

require 'pp' 

pp se 
pp e 
pp se.details 

# Eval.delete(se.eval_id) 
se.delete