ActiveRecord STI удаление не работает правильно - PullRequest
0 голосов
/ 13 октября 2010

Я хочу сохранить две модели, используя активную запись, но удаление не работает должным образом.

  1. Оценка имеет идентификатор, имя и описание
  2. и SqlEvaluation имеет два дополнительных столбца query_string и database.

Я хочу использовать эти две таблицы, и 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
);

После некоторых исследований я использовал следующий код, он работает хорошо, за исключением «delete», которое не удаляло строку в 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

1 Ответ

0 голосов
/ 13 октября 2010

Извините, что испортил кодЭто первый раз для меня.Вот код.

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
...