1

除了它们引用的 ActiveRecord 类之外,我有两种相同的方法:

def category_id_find(category_name)
  category = Category.find_by_name(category_name)
  if category != nil
    return category.id
  else
    return nil
  end
end

def brand_id_find(brand)
  brand = Brand.find_by_name(brand)
  if brand != nil
    return brand.id
  else
    return nil
  end
end

现在,我只知道必须有一种更 Railsy/Ruby 的方式来将其组合成某种动态创建的方法,该方法需要两个参数,即要查找的类和字符串,所以我尝试(但失败)了这样的事情:

def id_find(class, to_find)
  thing = (class.capitalize).find_by_name(to_find)
  if thing.id != nil
    return thing.id
  else
    return nil
  end
end

这意味着我可以打电话id_find(category, "Sports")

在从包含所有数据的单个怪物 CSV 文件播种期间,我必须填充表。因此,例如,我必须从 CSV 中获取所有不同的类别,将它们放入类别表中,然后根据刚刚填充的类别表中的 id 分配每个项目的 category_id,如果这有意义的话......

4

2 回答 2

1

class是 Ruby 中的保留关键字(仅用于类声明),因此您不能使用它来命名您的方法参数。开发者经常将其更改为klass,这样既保留了原意,又不与此限制冲突。但是,在这种情况下,您可能会将类的名称作为字符串传递,因此我将其称为class_name.

Rails 的 ActiveSupport 有许多内置的变形方法,您可以使用这些方法将字符串转换为常量。根据您的 CSV 数据的样子,您最终可能会得到如下结果:

def id_find(class_name, to_find)
  thing = (class_name.camelize.constantize).find_by_name(to_find)
  ...
end
于 2013-06-20T21:49:15.073 回答
0

如果使用字符串,您可以使用 constantize 而不是大写,并且您的代码应该可以工作(理论上):

thing = passed_in_class.constantize.find_by_name(to_find)

但是您也可以将实际的类本身传递给方法,没有理由不这样做:

thing = passed_in_class.find_by_name(to_find)
于 2013-06-20T21:48:46.387 回答