0

いくつかのビデオで、次の文字列を見ました:

User.select(:email).map(&:email)

それが何を意味するのか教えてください

私はその文字列を知っています

User.select(:email)

データベースからメール列のみを選択していますが、意味がわかりません

.map(&:email)

に変更できますUser.select(:email)User.pluck(:email)

チュートリアルから私はそれが同じ方法であることを理解しているからです。これは本当ですか?

4

3 に答える 3

1

map(&:email)が何を提供するかはすでにご存知だと思いますが、これを最初に見たときと同じことだったので、どのように、そしてなぜかを尋ねていると思います。つまり、これはブードゥーの結果があなたに返ってくる、より高度なルビーの魔法の1つです:)

基本的に、マップ関数を見てみましょう。それ自体、最も基本的な使用法は、ブロックレベルのコマンドを受け入れることです。そして、繰り返し処理した後、デフォルトの戻り値を取得して、使用できるように配列にチャックします。たとえば、これを見てみましょう

list = User.all 

したがって、ユーザーオブジェクト[ユーザーモデル、ユーザーモデル]などのリストを取得します。

list.map do |user|
  user.email
end

このブロックをIRBまたはRailsConsoleで実行すると、["some @ email.here、another@email.here"]などが表示されるので、この結果をキャッチして変数に割り当てます。

email_list = list.map do |user|
  user.email
end

これで、email_listは["some @ email.here、another@email.here"]と等しくなります。マップ関数の背景を取得したので、パラメーターを受け入れるさまざまな方法を詳しく見ていきましょう。

list.map {|user| user.email }

これは上記と同じですが、中括弧を使用してブロックロジックを囲みます

list.map(&:email)

これは上記の省略形です。ブロックを定義することで、ブロックアイテムで実行する子関数を指定するだけです。

これにより、速記法とそれに相当するブロックレベルについて少し洞察が得られたことを願っています。

于 2012-11-10T11:23:12.450 に答える
1

map(&:email)配列をUser、ユーザーの電子メールのみを含む文字列のマップにマップします。

Array.map は現在の配列を繰り返し処理し、パラメーター ブロックを呼び出して新しい配列を作成し、結果を新しい配列に格納します。これは次と同等です。

new_array = []
Users.select(:email).each do |user|
  new_array << user.email
end
于 2012-11-10T10:25:05.163 に答える
1

User.select(:email)

オブジェクトの配列を返していUserます。表現

User.select(:email).map(&:email)

そのオブジェクトの電子メール属性のみを選択します。したがって、電子メール文字列の配列になります。それは結局同じ

User.pluck(:email)

User.select(:email)しかし、それはその理由で異なります。

pluck のドキュメントも参照してください。

于 2012-11-10T10:39:19.777 に答える