簡體   English   中英

如何在Ruby中使用常量進行映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM