用trailblazer

时间:2016-02-03 20:21:20

标签: ruby-on-rails ruby activerecord trailblazer

环境:

CentOS-6.7 / OSX-10.9.5
Ruby 2.2.3p173 (probably time for an update)
Rails 4.2.5.1
Trailblazer 1.1.0

我正在研究开拓者书中的练习,并尝试将现有项目的元素映射到书中的示例。在我们手头的项目中,我们使用AR继承为单个底层表创建模型别名。下面给出一个例子:

class ARAccount< GLAccount
  after_initialize( :set_sub_ledger,  { :if => :new_record? } )
  has_one(  :active_client,
            -> { where IsActiveRow },
            :class_name => 'ARClient',
            :dependent => :restrict_with_error,
            :foreign_key => :gl_account_id
         )

  def gl_sub_ledger=( code )  # No change to sub_ledger value allowed
     gl_sub_ledger ||= AR_SUB_LEDGER   # Return 'AR' if not saved
  end

  private

  def set_sub_ledger          # set fixed value for AR sub_ledger
    write_attribute( :gl_sub_ledger, AR_SUB_LEDGER ) if new_record?
  end

  self.inheritance_column = :gl_ledger
  def sti_name
    "ASST"
  end
end

这种方法的工作方式是从单表继承中借用,因为列值是固定的&#39;对于每个变体模型定义,但基础表和行对于所有变体都是相同的。

我对如何在ar_invoice问题中的operation.rb文件中处理这个问题感到有些困惑。这个AR设置是在与AR进行一些努力来处理继承之后发展起来的,因此我对使用Trailblazer演示的更简单的方式非常感兴趣。

1 个答案:

答案 0 :(得分:2)

答案一年太晚了。

这是ARAccount::Create操作。

class ARAccount::Create < Trailblazer::Operation
  step Model( ARAccount, :new ) # this creates a new model for you.
  step :set_sub_ledger
  step # ... whatever you need after that.

  def set_sub_ledger(options, model:, **) # set fixed value for AR sub_ledger
    model.write_attribute( :gl_sub_ledger, AR_SUB_LEDGER )
  end
end

由于您进行了if new_record?次检查,因此您不需要set_sub_ledger中的Update步骤。

class ARAccount::Update < Trailblazer::Operation
  step Model( ARAccount, :find ) # this finds an existing model for you.
  step # ... whatever you need after that.
end

现在模特很渺茫。

class ARAccount< GLAccount
  has_one(  :active_client,
        -> { where IsActiveRow },
        :class_name => 'ARClient',
        :dependent => :restrict_with_error,
        :foreign_key => :gl_account_id
     )

  self.inheritance_column = :gl_ledger
  def sti_name
    "ASST"
  end
end

在引入Query个对象之前,通常会将范围和查找器留在模型中。