开发者

Is there a simpler way to find a record and return one of its attribute in Rails 3?

I found myself writing the following piece of code over and over again:

MyModel.find(my_id).my_field

I wonder if 开发者_StackOverflowthere is a simpler method to write this ?


If you are asking if there is more concise way of writing that.. not sure there is with the standard finders. What you have is pretty small. Just for fun I wrote this for you though :)

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

If you put this in your config/initializers as some file like crazy_finder.rb you can then just say:

MyModel.get_my_field(my_id)

It doesnt save you much, but just thought it would be fun to write.


In addition to Jake's global solution for every model and every attribute, you can easily define explicit individual accessors:

class MyModel
  def self.my_field(id)
    find(id).my_field
  end
end

Or an array of fields:

class MyModel
  class << self
    [:my_field, :other_field].each do |field|
      define_method field do |id|
        find(id).send(field)
      end
    end
  end
end


Are you doing this for same resource over and over again or to many different resources? It would really help if you'd give us better example of what you're trying to do, if you're doing that many times, it would help to give us example of what you're doing many times.

If you're doing this for one resource only to get different values:

If you're doing this in same action over and over again, you're doing it wrong. First store your result in a variable like this:

@mymodel = MyModel.find(id)

and then you can use

@mymodel.my_field

and then again (without the need to find it again)

@mymodel.different_field

or if you want to do this for a collection you can do:

@mymodels = MyModel.find([my_first_id, my_second_id, my_third_id])

etc.. better example from your side would help to help you!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜