まず、モデルの実際の列にexternal_id
保存するのではなく、id 用に別の列を作成することをお勧めします(その列は ActiveRecord で非常に重要であり、実際には直接設定したくありません)。 )。その列の一意性を検証して、同じユーザー データをデータベース内の複数の個別のレコードにインポートしないようにすることができます。id
User
その列を作成したら、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 ユーザーと
- 新しいユーザーを初期化します (
User.new
)
- id JSON データ (
line['user']['id']
)を割り当てます
- 新しいユーザー (
u.save
)を保存し、
u
それを返します(ブロックの最後)。
- 次に、( に割り当てられた
users
) 結果を取得し、データベースに実際に存在する (永続化された) もののみを選択します ( users.select(&:persisted?)
)。たとえば、一意性制約がオンになっていてexternal_id
、db データを再度ロードしようとすると、u.save
が返さfalse
れ、レコードは (再) 作成されず、メソッドから返された結果からそれらの結果が除外されます。
これは、必要な戻り値である場合とそうでない場合があります。name
また、ブロックにさらに属性の割り当て (JSON データからの など)を追加することもできます。他の詳細を記入するのはあなたに任せます。