可以使用多个表和列名称的Rails方法

时间:2013-04-15 15:07:08

标签: ruby-on-rails ruby ruby-on-rails-3.2 ruby-2.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方法将字符串转换为属性名称?

有人知道如何实现这个吗?它甚至可能吗?

提前致谢

1 个答案:

答案 0 :(得分: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方法正在返回类,而不是实例。