4

次のような class があるとArticleします。

class Article

  attr_accessor :title, :author

  def initialize(title, author)
    @title = title
    @author= author
  end

end

また、変数atribString属性の名前を含む です。この文字列をゲッターとして使用する変数に変換するにはどうすればよいですか?

a = Article.new
atrib='title'
puts a.eval(atrib)     # <---- I want to do this

拡張された

あるArray記事があり、それらをタイトルで並べ替えたいとします。次のように使用してコンパクトバージョンを実行する方法はありますか&:

col = Article[0..10]
sorted_one = col.sort_by{|a| a.try('title') }   #This works
sorted_two = col.sort_by(&:try('title'))   #This does not work
4

2 に答える 2

6

またはのいずれかを使用できsendますinstance_variable_get

a = Article.new 'Asdf', 'Coco'
a.pubic_send(:title) # (Recommended) Tries to call a public method named 'title'. Can raise NoMethodError
=> "Asdf"
# If at rails like your case:
a.try :title # Tries to call 'title' method, returns `nil` if the receiver is `nil` or it does not respond to method 'title'
=> "Asdf"
a.send(:title) # Same, but will work even if the method is private/protected
=> "Asdf"
a.instance_variable_get :@title # Looks for an instance variable, returns nil if one doesn't exist
=> "Asdf"

あなたの拡張された質問に対するショットの答え:いいえ。procsの&:symbolショートカットはメソッドに依存しますSymbol#to_proc。したがって、その動作を有効にするには、Symbol クラスでそのメソッドを再定義する必要があります。

class Symbol
  def to_proc  
    ->(x) { x.instance_eval(self.to_s) }    
  end  
end

[1,2,3].map(&:"to_s.to_i * 10")
=> [10, 20, 30]
于 2013-10-31T15:13:47.073 に答える
1

ActiveRecordインスタンスにはattributesハッシュがあります:

a = Article.new(title: 'foo')
#=> <#Article id: nil, title: "foo">

atrib = 'title'
a.attributes[atrib]
#=> "foo"

orderデータベースからソートされたオブジェクトを取得するために使用できます。

Article.order('title').first(10)
#=> array of first 10 articles ordered by title
于 2013-10-31T19:14:20.480 に答える