Ruby将字符串转换为另一个类的方法名称

时间:2015-04-21 07:45:37

标签: ruby ruby-on-rails-4

目的是使用迁移将TestApp模型的首选项存储到具有相同名称的MobileConfiguration模型中。

以下是迁移:

TestApp.where.not(business_id: nil).each do |test_app|
  configuration = MobileConfiguration.find_or_initialize_by(business_id: test_app.business_id)
  MobileConfiguration::DISCLAIMERS.each { |disclaimer| test_app.public_send(disclaimer) }
  configuration.max_store_distance_radius = test_app.max_store_distance_radius
  configuration.save
end

MobileConfiguration::DISCLAIMERS.each { |disclaimer| test_app.public_send(disclaimer) }应将test_app数据存储到mobile_configuration中。

DISCLAIMERS是一个模型MobileConfiguration的数组。

MobileConfiguration::DISCLAIMERS = [:app_disclaimer, :upgrade_disclaimer, :game_disclaimer]

:app_disclaimer, :upgrade_disclaimer, :game_disclaimerMobileConfiguration模型

中的偏好设置
preferences(:configurations) do
  preference_group "Disclaimer" do
    string :app_disclaimer
    string :game_disclaimer
    string :upgrade_disclaimer
  end
end

2 个答案:

答案 0 :(得分:0)

将public_send与一个属性一起使用只调用该方法。您需要使用另一个属性将一些数据传递给方法。你还需要调用setter来传入数据。所以:

class Foo
  attr_accessor :bar
end

foo = Foo.new

foo.public_send 'bar' # Just returns the current value of @bar - so nil.

foo.public_send 'bar=', 'something' # calls the setter and passes in 'something'

foo.public_send 'bar' # Now returns 'something'

答案 1 :(得分:0)

[MobileConfiguration::DISCLAIMERS].each do |property|
  configuration.public_send("#{property}=",test_app.public_send(property))
 end

可用于将值从一个模型复制到另一个模型以获取首选项。