[英]Using Variables for Model Names in Active Record
我正在編寫一個種子文件,該文件將通過HTTParty進行多個API調用,以填充數據庫。 我為幾種不同的模型提取了相同的信息,並且我希望能夠對所有模型使用一種方法。 但是,我無法弄清楚如何通過變量引用模型名稱。 具體來說,我遇到了困難,因為每個困難都必須屬於另一個模型。 我嘗試了以下方法:
def create_assets(subject, model, geokit_hoods)
response = HTTParty.get("https://raw.githubusercontent.com/benbalter/dc-maps/master/maps/#{subject}.geojson")
parsed = JSON.parse(response)
collection = parsed["features"]
collection.each do |station|
coordinates = station["geometry"]["coordinates"].reverse
point = Geokit::LatLng.new(coordinates[0], coordinates[1])
geokit_hoods.each do |hood|
if hood[1].contains?(point)
hood[0][model].create(coordinates: coordinates, name: station["properties"]["NAME"], address: station["properties"]["ADDRESS"])
break
end
end
end
end
我通過以下方式致電:
create_assets("metro-stations-district", "metros", geokit_hoods)
hood [0]是指現有的鄰域模型,而hood [1]是與該鄰域關聯的多邊形。 該代碼在引用hood [0] .metros.create(...)時有效,但是我正在尋找一種使該方法在許多模型中有用的方法。
任何想法,將不勝感激!
現在,我將假設您在變量中擁有的是String
,它是表名格式的類的名稱。 例如,在您的示例中,變量中包含了metros
...從此,我假設您正在嘗試創建Metro
類。
如果是這樣,則首先需要將小寫的表名樣式變量( "metros"
)轉換為類名樣式,例如"Metro"
注意:這是標題區分大小寫和單數(而不是復數)。
Rails有一種方法可以針對所需的目的對字符串執行此操作: classify
例如可以按以下方式使用它:
model_name = hood[0][model] # 'metros'
model_name.classify # 'Metro'
請注意,它仍然只是一個字符串,您不能在字符串上調用create
..那么如何使它成為真實的類呢? constantize
使用它可以將字符串變成您要查找的實際模型類...然后create
在以下位置調用create
:
model_name = hood[0][model] # 'metros'
the_klass = model_name.classify.constantize # Metro
your_instance = the_klass.create(...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.