环境:
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演示的更简单的方式非常感兴趣。
答案 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
个对象之前,通常会将范围和查找器留在模型中。