![](/img/trans.png)
[英]How to create case(switch) statement with a hash of constants using ruby on rails?
[英]How to map using constants in 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
使用常量嗎?
只需使用send
:
Car.where(brand: car_brands.map { |c| c.send(HONDA) })
我不確定您將要使用它的確切位置,或者確切地說是您來自哪里,但是這里有一個遵循Rails約定的示例:
class Brand < ActiveRecord::Base
has_many :cars
end
class Car < ActiveRecord::Base
belongs_to :brand
end
然后,您可以找到與“本田”品牌相關的所有汽車:
Brand.find_by(name: 'Honda').cars
或使用JOIN
操作查找匹配一個或多個任意品牌名稱的所有汽車:
Car.joins(:brand).where(brand: { name: %w[ Honda Ford ] })
如果您在Rails中順其自然,那么事情會容易得多。
您可以在map上使用常量嗎?
不。 無論如何,不是這樣。
car_brands.map { |c| c.HONDA }
這意味着,對於car_brands
所有事物,都car_brands
調用方法 HONDA
並返回調用結果。 因此,除非您定義了HONDA
方法(您絕對不應該這樣),否則就沒有機會使用它。
常量是在類上定義的,而不是在對象上定義的。 您可以通過.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
類,否則這不適用於您的用例。
首先,您可能不想采用這種方式。 也許這就是您的示例的措辭方式,但是,正如我正在閱讀的那樣,它唯一有意義的方法就是Car_brands
是一組數組。 如果是這樣,那么擁有一個稱為HONDA
的常量是沒有意義的。 如果有的話,對於給定的類,您將有一個名為BRAND
的常量,該常量可能等於“ Honda”。 我強烈建議您在繼續之前重新考慮數據結構。
const_get
,您可以使用const_get
通過map訪問常量。 例如
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"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.