Rails:ActiveModel加入class.name

时间:2018-07-19 19:01:57

标签: ruby-on-rails ruby-on-rails-4

我正在尝试创建一个不寻常的关联,在该模型上,我将使用foreign_key / primary_key作为模型的类名的模型上具有has_one关联。

例如:

class ProcessAction
  has_one :process_action_type, :foreign_key => 'class_name', :primary_key => :class_name

  def class_name
    @class_name = class.name #i.e. "ProcessAction::SubclassOne"
  end
end

class ProcessActionType
end

ProcessAction模型是使用STI的一系列子类的父模型。 ProcessActionType模型是一个类,该类列出了ProcessAction的所有子类,以及应用程序中使用的其他相关信息,例如处理顺序,例如:

Process Action Types
ID  class_name                    priority visible_to
1   ProcessAction::SubclassOne    1        customer
2   ProcessAction::SubclassTwo    2        admin
3   ProcessAction::SubclassThree  3        both

我知道我可以指定正确的:foreign_key并指定一个:primary_key,但是可以使用class_name(即“ ProcessAction :: SubclassOne”)作为主键吗?

我可能不得不退后一步,只是在每个process_action记录上放置一个process_action_type_id,但是如果可能的话,我想避免这种情况,因为它隐含在process_action的类类型中。

使用Rails 4.1

谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为您可以使用has_onebelongs_to,因为这些方法会固有地比较目标记录的ID。

最好在需要时提供一种提取类型记录的方法。

def process_action_type
  ProcessActionType.find_by(class_name: self.class)
end