1

我想知道是否有一种方法可以从哈希创建迁移/模型。例如,我有一个 Twitter API 响应:

 twitter = {:possibly_sensitive_editable=>true,
 :geo=>nil,
 :text=>"http://t.co/asdf",
 :created_at=>"Tue Nov 20 18:10:31 +0000 2012",
 :possibly_sensitive=>false,
 :in_reply_to_status_id_str=>nil,
 :coordinates=>nil,
 :id_str=>"123456",
 :retweeted=>false,
 :in_reply_to_user_id_str=>nil,
 :in_reply_to_screen_name=>nil,
 :source=>"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",
 :entities=>
 {:media=>
    [{:type=>"photo",
     :indices=>[0,
     20],
     :url=>"http://t.co/asdf",
     :expanded_url=>"http://twitter.com/qwerty/",
     :media_url_https=>"https://p.twimg.com/qwerty.jpg",
     :source_status_id_str=>"123456",
     :id_str=>"123456",
     :sizes=>
           {:medium=>{:h=>1003,
                      :w=>600,
                     :resize=>"fit"}}}]}}

如果我想从这个哈希创建一个模型(或者更确切地说是模型),有没有一种快速的方法来做到这一点?我可以想象通过将整个内容解析为文本然后将迁移编写为文本文件来实现,但怀疑这是最好的方法..

因此,如果我想至少从第一级哈希创建一个模型(即只是 Twitter,而不是媒体) - 有没有一种快速的方法来实现这一点?嵌套哈希是否可能?

4

3 回答 3

2

是否有可能(对于非嵌套哈希)?当然。干得好:

class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|


      twitter = {:possibly_sensitive_editable=>true,
        :geo=>nil,
        :text=>"http://t.co/asdf",
        :created_at=>"Tue Nov 20 18:10:31 +0000 2012",
        :possibly_sensitive=>false,
        :in_reply_to_status_id_str=>nil,
        :coordinates=>nil,
        :id_str=>"123456",
        :retweeted=>false,
        :in_reply_to_user_id_str=>nil,
        :in_reply_to_screen_name=>nil,
        :source=>"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>"
      }

      twitter.keys.each do |key|
        t.string key
      end


      t.timestamps
    end
  end
end

>> Tweet.new
=> #<Tweet id: nil, possibly_sensitive_editable: nil, geo: nil, text: nil, created_at: nil, possibly_sensitive: nil, in_reply_to_status_id_str: nil, coordinates: nil, id_str: nil, retweeted: nil, in_reply_to_user_id_str: nil, in_reply_to_screen_name: nil, source: nil, updated_at: nil>

可取吗?不...您可以看出这些属性中的每一个都只是字符串,而不是时间戳或布尔值。

但是您可以将其作为基线并进行调整。不建议

于 2012-11-20T19:03:09.010 回答
0

您要根据此响应中的字段名称创建新的模型类和新的数据库表吗?通过一些黑客攻击,我相信你可以。但这将是一个坏主意。

模型和数据库模式通常不是在应用程序运行时创建的。你不需要这样做。API 通常以非常结构化的格式返回数据,只需一两分钟即可进行迁移以保存您想要的数据,然后您可以使用很长时间。

并且值得仔细检查每个字段,考虑为什么要存储它,您希望它是什么数据类型,是否可以丢弃它等等。盲目地将此 API 响应中的每个字段保存到您的数据库可能最终会存储大量您永远不会使用的数据。

不要偷懒。创建模型,手动调整迁移,并仔细考虑管理该模型所需的数据和代码。值得手动操作。

于 2012-11-20T18:50:07.917 回答
0

根据 Jesse 的建议,我将其扩展为创建一种(非 Rails)/原生 ruby​​ 生成器。

我的 API 响应包含一个哈希数组,而我的 ActiveRecord 知识非常有限,只是从 Rails 开始,所以我猜这里还有改进的空间 - 在类型映射和结构中(例如,我可能想遍历哈希的所有实例在数组中并将其放入地图中,以便涵盖不同对象中字段的变化)。

# Illustrative structure of activities:
# activities = [{"key"=>"val"},{},{}]

puts "class CreateActivities < ActiveRecord::Migration
  def change
    create_table :activities do |t|"
activities.first.each do |key,val|
  arType = case val
    when Hash,Array
      "RELATION-Determine"
    when Float, Fixnum
      "t.integer"
    when FalseClass, TrueClass
      "t.boolean"
    else
      "t.string"
  end
  puts "      #{arType} :#{key}"
end
puts "      t.timestamps null: false
    end
  end
end"

然后运行$ ruby activities_generator.rb > db/migrate/$(date +"%Y%m%d%H%M%S")_create_activities.rb(如果是 linux)

于 2016-07-02T07:45:44.183 回答