views:

9

answers:

1

I want to store two models using active record, but delete doesn't work as expected.

  1. Evaluation has id, name and description
  2. and SqlEvaluation has additional two columns of query_string and database.

I want to use those two tables, and eval_typ_id is used to distinguish which subclass should be used: 1 for 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 );

After some researches, I use the following code, it works well except "delete", which didn't delete the row in sql_eval. I cannot figure out where is wrong?

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

A: 

Sorry for messing the code. It is first time to post for me. Here is the code.

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