2011-02-09 6 views
2

私は質問モデルと回答モデルを持っており、質問has_many Answers(多項選択問題です)を持っています。ruby​​ on railsブロックsytaxを使って&:

質問が質問オブジェクトの集合であるとします。

questions.collect(&:answers) 

つの質問:

  1. この構文は正確に何を意味している私はこれを行うことができ、すべての回答を収集するために

    ?それは

    questions.collect { |q| q.answers } 
    

    に展開されていますか?

  2. 同じ構文を使用して

    questions.collect { |q| q.answers.shuffle } 
    

    を行う方法はありますか?

    collect(&:answers.shuffle) 
    

    はしていません。

私は(検索エンジンは「&を」無視する)は、Web上でRubyのブロック上のチュートリアルでこれを見つけて、それが動作しませんを探しているように見えることはできません。私はいくつかの継承されたコードでそれを見つけました。

おかげ

+0

'[ruby] ampersand'を使ってStack Overflowを検索しようとしましたか? –

+1

ハ!あなたが正しい。これは現在いくつかの二重引用符のうちの1つです: http://stackoverflow.com/questions/1961030/ruby-ruby-on-rails-ampersand-colon-shortcut – Brian

+0

[map(&:name)はどういう意味ですか? Rubyで?](http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby) –

答えて

0

はい、最初の質問は、N-重複しているが、2番目に関して:いいえ、することはできませんチェーン方法。あなたも、それはおそらく非常に美しいではありませんが、引数を送信する方法を見つけることができます

class Symbol 
    def to_proc 
    proc do |obj| 
     self.to_s.split(/\./).inject(obj, :send) 
    end 
    end 
end 

p ["1", "2", "3"].map(&:"to_i.succ") 
# [2, 3, 4] 

しかし、何も独自のツールを作成するために、人 - パズルもコードを書くよりも、あなたが - その他停止しません。

0

あなたはどちらか

questions.collect { |q| q.answers.shuffle } 

と@toklandから1の間で選択することができます。 あなたのコードはあなたと他の開発者にコードの可読性を与え、toklandsソリューションは簡単にアクセスできるようにします。 このパターンを頻繁に使用する場合は、to_procメソッドをオーバーライドします。そうでなければ難しい道を使い、自然と遊んではいけません。