How do I save a save a has_many association?
I have setup a service that parses and saves the result of an external API which all works great, however, I can't work out how to save the array of images that need to be saved in a has_many relation.
The service:
module Domain
class FetchUserPosts
def initialize(token)
@token = token
end
def get_listings
resp = client.get("/v1/some/api/posts")
resp.body.each do |post|
@user.posts.create(
headline: post["headline"],
body: post["body"],
images: listing["media"].map { |l| l["url"]} ???
)
end
end
private
def client
Faraday.new(url: "https://example.com", headers: { "Authorization" => "Bearer #{@token}" }) do |f|
f.request :json
f.request :retry
f.response :logger, Rails.logger
f.response :raise_error
f.response :json
f.adapter Faraday.default_adapter
end
end
end
end
The Post Model that it saves to:
class Post < ApplicationRecord
belongs_to :user
has_many :images, as: :imageable
end
And the associated Image model:
class Image < ApplicationRecord
belongs_to :imageable, polymorphic: true
end
Everything works except I'm unsure how to deal with the images which look like:
[{
"type" => "image",
"url" => "https://image-1.jpg"
}, {
"type" => "image",
"url" => "https://image-2.jpg"
}]
Hey Morgan,
Just iterate through the images and save each one like you would any has_many
def get_listings
resp = client.get("/v1/some/api/posts")
resp.body.each do |post|
user = @user.posts.new(
headline: post["headline"],
body: post["body"]
)
listing["media"].each do |media|
user.images.build(url: media["url"])
end
user.save
end
end
I haven't tested this, so you may have to play around with it some (you may need to actually save the user first, then iterate through and build the associations, I can't recall off the top of my head) but you should get the idea.