重构宝石模型 - rake-task中的复数变量

时间:2015-06-21 12:03:40

标签: ruby-on-rails ruby

我是早期的红宝石开发人员,请原谅我,如果这很明显的话。

使用gioco gem实现游戏化概念我重命名了一些类和引用以更好地适应项目(测试了所有内容并且它正在工作)。

有问题的重命名是Kind => BadgeKind。

以下任务中的这一行:

r.points << Point.create({ :badge_kind_id => kinds.id, :value => '#{args.points}'})

kinds.id背后的概念是什么?如何解决这个问题?

错误: NameError: undefined local variable or method 'kinds' for main:Object

我尝试过:badge_kindbadge_kinds

任务:

task :add_badge, [:name, :points, :kind, :default] => :environment do |t, args|
arg_default = ( args.default ) ? eval(args.default) : false

if !args.name || !args.points || !args.kind
  raise "There are missing some arguments"
else
  badge_string = "kind = BadgeKind.find_or_create_by(name: '#{args.kind}')\n"

  badge_string = badge_string + "badge = Badge.create({ 
                  :name => '#{args.name}', 
                  :points => '#{args.points}',
                  :badge_kind_id  => kind.id,
                  :default => '#{arg_default}'
                })
"

  if arg_default
    # changing User.find(:all) to User.all
    badge_string = badge_string + 'resources = User.all
'
    badge_string = badge_string + "resources.each do |r|
    r.points  << Point.create({ :badge_kind_id => kinds.id, :value => '#{args.points}'})
      r.badges << badge
      r.save!
    end
"
  end

  badge_string = badge_string + "puts '> Badge successfully created'"

  # puts "badge_string:\n" + badge_string
  eval badge_string
end

1 个答案:

答案 0 :(得分:0)

您的应用程序中似乎已经有KindBadge的表格。如果是这种情况,那么将Badge重命名为BadgeKind并不是一个好主意。原因是因为这种表示法通常用于连接表,看起来你可能正在与一个表冲突。现在,我猜测Badge可以有Kind,反之亦然。为了实现这一点,可能会有一个包含其关系的BadgeKind表。如果没有看到您的架构文件或迁移,我无法确定,但您可能最好离开它,或至少选择其他名称,如BadgeType

此外,值得注意的是,构建使用eval执行的字符串被视为反模式。 Eval很慢,并且还会使您的应用程序暴露于恶意代码注入。你的风险较小,因为看起来这是一个rake任务,但即便如此,如果你重构这个代码,你应该尝试不同的策略。看起来重构起来会相对简单。