我发现自己一遍又一遍地编写以下代码:
MyModel.find(my_id).my_field
我想知道是否有更简单的方法来写这个?
如果你问是否有更简洁的写作方式......不确定标准查找器是否有。 你所拥有的很小。只是为了好玩,我为你写了这个:)
class ActiveRecord::Base
def self.method_missing_with_retrieve_just_a_field(method_called, *args, &block)
if(method_called.to_s=~/get_/)
self.find(args[0]).send(method_called.to_s.gsub("get_", ""))
else
method_missing_without_retrieve_just_a_field(method_called, *args, &block)
end
end
class << self
alias_method_chain :method_missing, :retrieve_just_a_field
end
end
如果您将其作为 crazy_finder.rb 之类的文件放在配置/初始值设定项中,则可以说:
MyModel.get_my_field(my_id)
它并没有为你节省太多,但只是认为写起来会很有趣。
除了 Jake 针对每个模型和每个属性的全局解决方案之外,您还可以轻松定义显式的单个访问器:
class MyModel
def self.my_field(id)
find(id).my_field
end
end
或一组字段:
class MyModel
class << self
[:my_field, :other_field].each do |field|
define_method field do |id|
find(id).send(field)
end
end
end
end
您是一遍又一遍地为同一资源或对许多不同的资源执行此操作?如果你能给我们更好的例子来说明你想做的事情,那真的会很有帮助,如果你做了很多次,给我们很多次你正在做的事情的例子会有所帮助。
如果仅对一个资源执行此操作以获取不同的值:
如果你一遍又一遍地在同一个动作中这样做,你就做错了。首先将结果存储在如下所示的变量中:
@mymodel = MyModel.find(id)
然后你可以使用
@mymodel.my_field
然后再次(无需再次找到它)
@mymodel.不同字段
或者,如果要为集合执行此操作,可以执行以下操作:
@mymodels = MyModel.find([my_first_id, my_second_id, my_third_id])
等等,你身边更好的例子会帮助你!