我发现自己一遍又一遍地编写以下代码:
MyModel.find(my_id).my_field
我想知道是否有更简单的方法来写这个?
答案 0 :(得分:2)
如果你问是否有更简洁的写作方式......不确定是否有标准的查找器。你拥有的东西很小。为了好玩,我为你写了这个:)
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这样的文件放在你的config / initializers中,那么你可以说:
MyModel.get_my_field(my_id)
它并没有为你节省太多,但只是认为写作会很有趣。
答案 1 :(得分:1)
除了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
答案 2 :(得分:0)
您是一遍又一遍地使用相同的资源还是针对许多不同的资源?如果你给我们更好的例子说明你要做的事情,如果你多次这样做,那将会很有帮助,这将有助于我们举例说明你在做多少次。
如果您为一个资源执行此操作仅获取不同的值:
如果你一遍又一遍地采取同样的行动,你做错了。首先将结果存储在如下变量中:
@mymodel = MyModel.find(id)
然后你可以使用
@ mymodel.my_field
然后再次(无需再次找到)
@ mymodel.different_field
或者如果您想为集合执行此操作,您可以执行以下操作:
@mymodels = MyModel.find([my_first_id,my_second_id,my_third_id])
等。来自你方的更好的例子将有助于你!