有没有更简单的方法来查找记录并在Rails 3中返回其中一个属性?

时间:2011-05-13 05:31:11

标签: ruby-on-rails ruby-on-rails-3 activerecord

我发现自己一遍又一遍地编写以下代码:

MyModel.find(my_id).my_field

我想知道是否有更简单的方法来写这个?

3 个答案:

答案 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])

等。来自你方的更好的例子将有助于你!