簡體   English   中英

在Active Record中使用變量作為模型名稱

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

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