2017-02-15 8 views
1

私はすでに定義されている定数を使ってカスタム値の配列をマップしようとしています。私はいくつかの問題に走っています。Rubyで定数を使用してマップする方法

これは完璧に動作します:

Car.where(brand: car_brands.map(&:Car_honda)) 

私はすでに私のファイルで定義されているすべての車のブランドを持っているので、私は名前を書き換え上の定数を使用することを好むだろうが。例えば:私がしようとすると、配列にこれが一定でマッピングする場合

HONDA = "Car_honda" 

正常に動作していないよう:

Car.where(brand: car_brands.map(&:HONDA)) 

私はmapでブロックを使用しようとしましたが、私はまだです同じ結果:

Car.where(brand: car_brands.map {|c| c.HONDA})) 

mapの定数を使用できますか?

+3

「car_brands」とは何ですか? –

+0

&:あなたの例では、HONDAは列名にする必要があります。だから&:何かあなたは私があなたのケースでは本当にcar_hondaだろうと思う列名をマップする –

+1

あなたは何を達成したいですか? –

答えて

4

ちょうどsendを使用します。

Car.where(brand: car_brands.map { |c| c.send(HONDA) }) 
+1

'HONDA'メソッドが定義されていると思いますか? –

+1

@SergioTulentsev 'HONDA'は文字列' Car_honda'を返す定数です。これには対応するメソッドがあります。また - * 'public_send'はより安全です。 –

+0

'' c.send(HONDA) 'は' Car_honda'( 'HONDA'定数の値)というメソッドを呼び出します:' HONDA = "Car_honda";クラスの車; def Car_honda; 「ホンダ」の終わりを置きます。 Car.new.send(HONDA) ' – Inpego

0

マップで定数を使用できますか?

いいえ。とにかく、これは好きではありません。

car_brands.map { |c| c.HONDA }

これは、その上にcar_brandsコール方法HONDAですべてのもののためにと呼び出しの結果を返す、意味。したがって、メソッドHONDAが定義されていない限り(これは絶対にすべきではありません)、これは動作する機会がありません。

+0

Car.where(car_brands: "HONDA")地図(&:id)は、ブランドがHONDAの車のIDを表示します –

+0

@KcUS_unico:あなたはどのように知っていますか? :) –

+0

申し訳ありませんが、それは確かではありません。 !!! ;-)これは、値 "HONDA"を持つcar_brands列がある場合にのみ機能します。ありがとう! ;-) –

0

定数はないオブジェクトに、クラスで定義されています。 .classから呼び出すことができます。

:005 > Integer.const_set('ABC', 1) 
=> 1 
:006 > Integer::ABC 
=> 1 
:007 > [1,2,3].map {|i| i.class::ABC} 
=> [1, 1, 1] 

car_brandsが異なるCarクラスの配列が含まれていない限り、これはあなたのユースケースでは動作しません。

+0

あなたは本当に、 'const_set'を使ってコアRubyクラスの任意の定数でスパイクすることを嫌うことは望ましくありません。 – tadman

+1

@tadman:私は自分のクラスを定義することは、この例では過度のことであると考えました。そして、はい、これは実際のプロジェクトにとっては悪い考えです。 – fylooi

0

まず、このようにしたくないでしょう。おそらくそれはあなたの例が言われている方法ですが、私が読んでいるように意味がある唯一の方法は、Car_brandsがクラスの配列であるかどうかです。その場合、ifは定数を持つことに意味がないHONDAと呼ばれます。何かがある場合は、与えられたクラスに対して "ホンダ"と等しいかもしれないBRANDという定数があります。前進する前にデータ構造を再考することを強くお勧めします。

すべてのことは、マップを使用してconst_getを使用して定数にアクセスすることができます。例えば

私はあなたがこれを行っている、または正確にどこから来ているが、ここではRailsの規則に従う例だ場所がわからないんだけど
class CarBrand1 
    BRAND = 'Honda' 
end 

class CarBrand2 
    BRAND = 'Toyota' 
end 

car_brands = [CarBrand1, CarBrand2] 

car_brands.map{|car_brand| car_brand.const_get("BRAND")} 
car_brands.map{|car_brand| car_brand::BRAND} # Alternatively 
# => ["Honda", "Toyota"] 
+0

あなたができることができるという理由だけではありません。これは多くのオブジェクト指向設計原則に違反します。 – tadman

+1

私は非常に同意します。これは、定数を使用して設定されている場合、これを行う方法です。これは最善の方法ではありませんが、それが設定されていればどのように行えるかです。これを処理する正しい方法が、アプリの詳細を見ることなく何を言っているのかは言うまでもありません。 – Glyoko

1

class Brand < ActiveRecord::Base 
    has_many :cars 
end 

class Car < ActiveRecord::Base 
    belongs_to :brand 
end 

その後、あなたはすべてを見つけることができます「ホンダ」ブランドに関連した車:

Brand.find_by(name: 'Honda').cars 

またはJOIN操作を使用して1つまたは複数の任意のブランド名に一致するすべての車を見つける:

Car.joins(:brand).where(brand: { name: %w[ Honda Ford ] }) 

もしあなたがRailsの流れに乗っていれば、はるかに簡単です。

+1

質問には特に答えませんが、これは最もクリーンで最も効率的な答えです。そして間違いなく正しい方向です。 –

関連する問題