0

希望你们一切都好!

我有一个一般性的询问,我想知道是否有善良的灵魂可以提供帮助?目前这确实是一个好奇的问题,但我觉得它可能是未来非常有用的信息片段。

是否可以编写一个可以传递表名和属性(列)名称并对其执行操作的方法?我想这种方法的主要用途是在对表进行重复操作时保持代码干燥。

作为一个例子(虽然完全是一个玩具例子)假设我有一个方法:

def switch(table_name, column_name)
    #do some operation on table_name.column_name
end

我已经弄清楚如何通过执行以下操作来访问表:

def model_for_table(table_name) 
    table_name.to_s.classify.constantize 
end

这将采用 underscored_lowercase_string 并返回表名,这样model_for_table("registered_user").find(1)虽然在表名可以被硬编码的情况下这是不必要的

但它不像model_for_table("registered_user").column_name上面例子中使用的那样。是否有类似于model_for_table上面提供的将字符串转换为属性名称的方法?

有谁知道我怎么能实现这个?有可能吗?

提前致谢

4

1 回答 1

1

问题是您需要一个正在处理的模型的实例才能访问列。如果您有 RegisteredUser 模型,请尝试(在 Rails 控制台中)RegisteredUser.id(或任何属性名称)。它行不通。但是,如果您这样做了RegisteredUser.first.id(假设您保存了一个),它将起作用。

所以这取决于你想要完成什么。如果您的switch方法旨在对您的模型实例做一些事情,那么这仍然可以工作。

def switch(table_name, column_name)
  model = model_for_table(table_name)
  model.all.each do |model_instance|
    puts "model_instance #{column_name} is #{model_instance.send(column_name)}"
  end
end

注意:该send方法接受一个符号或一个字符串,并在调用它的实例上执行具有该名称的方法。这是一个普通的 Ruby 事情,而不是 Rails 事情。

请记住,您的model_for_table方法返回的是类,而不是实例。

于 2013-04-15T15:19:11.150 回答