Параметры строки будут интерпретироваться в текущем контексте, поэтому вы можете позвонить туда self.name
или name
напрямую:
SomeClass.class_eval "has_many :#{name.tableize}, :through=>:join_models"
Если вместо выполнения оценки для строки, которую вы использовали, обратите внимание, что class_exec
- это вариант class_eval
, который позволяет вам передавать параметры естественным образом. Итак:
SomeClass.class_exec(name.tableize.to_sym) do |klass|
has_many klass, :through=>:join_models
end
Это новое для 1.8.7, поэтому вам нужно require 'backports/1.8.7'
, если в 1.8.6.
Примечание: я предполагаю, что вам вообще нужно eval, потому что в вашем конкретном примере вы можете вызвать этот метод напрямую, нет?
SomeClass.has_many name.tableize.to_sym, :through=>:join_models