2013-02-10 29 views
3

我想下面的哈希传递给活动记录保存:没有Rails的活动记录:如何将任意哈希传递给活动记录

[{ 
    "id"=>"WSECOUT", 
    "realtime_start"=>"2013-02-10", 
    "realtime_end"=>"2013-02-10", 
    "title"=>"Reserve Bank Credit - Securities Held Outright", 
    "observation_start"=>"1989-03-22", 
    "observation_end"=>"2013-02-06", 
    "frequency"=>"Weekly, Ending Wednesday", 
    "frequency_short"=>"W", 
    "units"=>"Billions of Dollars", 
    "units_short"=>"Bil. of $", 
    "seasonal_adjustment"=>"Not Seasonally Adjusted", 
    "seasonal_adjustment_short"=>"NSA", 
    "last_updated"=>"2013-02-08 08:32:33-06", 
    "popularity"=>"42", 
    "notes"=>"The amount of securities held by Federal Reserve Banks. This quantity is the cumulative result of permanent open market operations: outright purchases or sales of securities, conducted by the Federal Reserve. Section 14 of the Federal Reserve Act defines the securities that the Federal Reserve is authorized to buy and sell." 
    }] 

我的Ruby类看起来是这样的:

require 'rubygems' 
require 'active_record' 
require 'logger' 

ActiveRecord::Base.establish_connection( 
:adapter => "mysql2", 
:host => "localhost", 
:username => "root", 
:password => "*********", 
:database => "fred" 
) 

class Series < ActiveRecord::Base 

    attr_accessible :id, :realtime_start, :realtime_end, :title, :observation_start, 
       :observation_end, :frequency, :frequency_short, :units, :units_short, 
       :seasonal_adjustment, :seasonal_adjustment_short, :last_updated, 
       :popularity, :notes 

end 

require_relative 'wsecout' 
@series = Wsecout.new.getSeries "wsecout" 
@series = @series['series'] 

test = Series.create(@series) 

@series变量包含散列。当我运行这段代码时,该对象的创建与mysql中的行一样,但是,这些字段中没有数据。我知道我在这里错过了一步,但我无法弄清楚哪一步。另外,是否会出现包含ID的Hash问题,因为Active Record会创建它自己的ID?

+3

如果你的第一个例子是正确的,那么@series包含一个带有一个散列的数组。尝试'@series ['series'] [0]'或其他。或者,您可以发布'puts @series ['series']。inspect'的输出。 – Wukerplank 2013-02-10 17:03:36

+0

工作表示感谢。有关如何将Hash中的id映射到与Action Record:id不同的:id的任何想法?在这种情况下,哈希具有“WSECOUT”的“id”。有没有办法在我使用Series.create(@series)的时候将该“id”映射到一个名为:series_id的新字段? – JohnGalt 2013-02-10 17:47:36

回答

1

回答你的第二个问题“地图说,‘ID’,以一个所谓的新领域:series_id”:

@series['series'][0]['series_id'] = @series['series'][0]['id'] 
@series['series'][0].delete('id') 

或者,如果你想要根据某些条件来改变多个按键,这时如果用它在条件如下:

@series['series'][0].keys.each do |k| 
    if(k == 'id') 
    @series['series'][0]['series_id'] = @series['series'][0][k] 
    @series['series'][0].delete(k) 
    end 
end 

这将通过散列每个迭代的关键,如果到id的关键比赛,然后将其添加另一个关键series_id具有相同的值并删除id

+0

我试着用@series替换'h',并收到以下错误:''

':block unexpectedly(LocalJumpError)' – JohnGalt 2013-02-10 19:41:40

+0

哦,我的坏!刚刚更新了答案,删除了返回语句 – 2013-02-10 19:53:48

+0

首先感谢您的帮助!这工作完美,我更新我的原始问题,以反映你的变化。 – JohnGalt 2013-02-10 20:02:12