我有一个普遍的询问,我想知道某个善良的灵魂是否可以提供帮助?这真是一个好奇的问题,但我觉得这可能是一个非常有用的信息片段。
是否可以编写一个可以传递表名和属性名称(列)的方法并对这些方法执行操作?我想这种方法的主要用途是在对表进行重复操作时保持代码干燥。
作为一个例子(虽然完全是玩具的例子)假设我有一个方法:
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
方法将字符串转换为属性名称?
有人知道如何实现这个吗?它甚至可能吗?
提前致谢
答案 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
方法正在返回类,而不是实例。