9

gem 'httparty' を使用して外部ソースへの GET 呼び出しを行っています。ここに私のController.rbがあります:

def show
  response = HTTParty.get('URI')
  user = JSON.parse(response)
  user.each {|line| puts line['user']['id']}
  #the "['user']['id']" is because of the nested JSON object that is returned after the 
  parse.
end

これにより、Rails コンソールに正しい出力が返されますが、['id'] をデータベースに保存するにはどうすればよいですか?

現在、私の User モデルには :id と :name; があります。外部 API からの JSON オブジェクトは、:id と :name を、私が必要としないその他の情報と共に送信します。

class User < ActiveRecord::Base
   attr_accessor :id, :name
end

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

16

まず、モデルの実際の列にexternal_id保存するのではなく、id 用に別の列を作成することをお勧めします(その列は ActiveRecord で非常に重要であり、実際には直接設定したくありません)。 )。その列の一意性を検証して、同じユーザー データをデータベース内の複数の個別のレコードにインポートしないようにすることができます。idUser

その列を作成したら、Userモデルにクラス メソッドを作成し (私は mine と呼びましたsave_data_from_api)、JSON データを db にロードします。

class User < ActiveRecord::Base

  # optional, but probably a good idea
  validates :external_id, :uniqueness => true

  def self.save_data_from_api
    response = HTTParty.get('URI')
    user_data = JSON.parse(response)
    users = user_data.map do |line|
      u = User.new
      u.external_id = line['user']['id']
      # set name value however you want to do that
      u.save
      u
    end
    users.select(&:persisted?)
  end

end

これが何をするか:

  • JSON データをブロック ( user_data.map) にマップし、各 JSON ユーザーと
    1. 新しいユーザーを初期化します ( User.new)
    2. id JSON データ ( line['user']['id'])を割り当てます
    3. 新しいユーザー ( u.save)を保存し、
    4. uそれを返します(ブロックの最後)。
  • 次に、( に割り当てられたusers) 結果を取得し、データベースに実際に存在する (永続化された) もののみを選択します ( users.select(&:persisted?))。たとえば、一意性制約がオンになっていてexternal_id、db データを再度ロードしようとすると、u.saveが返さfalseれ、レコードは (再) 作成されず、メソッドから返された結果からそれらの結果が除外されます。

これは、必要な戻り値である場合とそうでない場合があります。nameまた、ブロックにさらに属性の割り当て (JSON データからの など)を追加することもできます。他の詳細を記入するのはあなたに任せます。

于 2013-01-17T08:27:26.700 に答える
0

uri_idここでは、外部IDをname格納するフィールドと、外部名をユーザーテーブルに格納するフィールドを作成したと想定しています。

あなたのコントローラーコード-

def show
  response = HTTParty.get('URI')
  JSON.parse(response).each do |item|
    if (item.id != nil && item.name != nil)
       u = User.new(:uri_id => item.id, :name => item.name)
       u.save
    end
  end
end
于 2013-01-17T08:44:05.110 に答える