Ruby on rails 通过一个方法加载有许多选项散列

Ruby on rails 通过一个方法加载有许多选项散列,ruby-on-rails,activerecord,rails-activerecord,Ruby On Rails,Activerecord,Rails Activerecord,我已经得到了一个复杂的模型,我正在努力把它弄干。对于我的has_,有很多选项,我不想让它们重复,我只想从类上的方法加载它们 class ExampleClass < ActiveRecord::Base has_many :related_things, get_association_hash(arg1) has_many :other_things, get_association_hash(arg2) def get_association_hash(arg)

我已经得到了一个复杂的模型,我正在努力把它弄干。对于我的has_,有很多选项,我不想让它们重复,我只想从类上的方法加载它们

class ExampleClass < ActiveRecord::Base
  has_many :related_things, get_association_hash(arg1)
  has_many :other_things, get_association_hash(arg2)

  def get_association_hash(arg)
    { :class_name => 'SomeClass', :conditions => ['table.column = ?', arg] }
  end
end
class-ExampleClass'SomeClass',:conditions=>['table.column=?',arg]}
结束
结束
不幸的是,在加载类时,这会导致#的未定义方法“get_association_hash”

class ExampleClass < ActiveRecord::Base
  has_many :related_things, get_association_hash(arg1)
  has_many :other_things, get_association_hash(arg2)

  def get_association_hash(arg)
    { :class_name => 'SomeClass', :conditions => ['table.column = ?', arg] }
  end
end
(作为一个健全性检查,如果我只调用它本身,而不将它包含在has_many中,那么该方法就可以了。此外,实际的类要大得多,因此DRY比这个小示例中的更有用。)


我注意到错误消息提到的是
Class
,而不是我的派生
ExampleClass
,因此它可能与加载多少有关,以及我在哪里定义我的方法?

has\u many
只是一个类方法,因此:

has_many :related_things, get_association_hash(arg1)
与任何其他调用一样,只是一个方法调用,该上下文中的接收方是您的
ExampleClass
。这意味着
get\u association\u hash
需要是一个类方法。您还必须在
多次调用之前定义它,否则您将无法在需要的地方调用它:

class ExampleClass < ActiveRecord::Base
  def self.get_association_hash(arg)
    { :class_name => 'SomeClass', :conditions => ['table.column = ?', arg] }
  end
  has_many :related_things, get_association_hash(arg1)
  has_many :other_things, get_association_hash(arg2)
end

你可能会把你的模块称为比煎饼更合理的东西,这只是我对事物的默认名称(因为foo在一段时间后会变得很无聊,我更喜欢传统)。

有很多
只是一个类方法,所以:

has_many :related_things, get_association_hash(arg1)
与任何其他调用一样,只是一个方法调用,该上下文中的接收方是您的
ExampleClass
。这意味着
get\u association\u hash
需要是一个类方法。您还必须在
多次调用之前定义它,否则您将无法在需要的地方调用它:

class ExampleClass < ActiveRecord::Base
  def self.get_association_hash(arg)
    { :class_name => 'SomeClass', :conditions => ['table.column = ?', arg] }
  end
  has_many :related_things, get_association_hash(arg1)
  has_many :other_things, get_association_hash(arg2)
end
你可能会称你的模块为比煎饼更合理的东西,这只是我对事物的默认名称(因为foo在一段时间后会变得无聊,我更喜欢传统)