Ruby on Rails - 种子未定义方法错误
Ruby on Rails - Seed undefined method error
在我的应用程序中,我有 Post
和 Slide
个模型。 post has many slides
& slide belongs_to post
.
我所有的幻灯片每张都有一张图片(我正在使用carrierwave gem
上传),但目前有些我的 post 没有图像。
我正在尝试抓取每个 post 的 第一张幻灯片 并在 seed
的帮助下将其图像上传到 post。
这是我在seeds.rb
中尝试过的:
posts = Post.all.where(image: nil)
posts.each do |post|
slide = Slide.where(post_id: post).order('created_at DESC').first
post.update(remote_image_url: slide.image_url(:thumb_huge))
end
AND
posts = Post.all.where(image: nil)
posts.each do |post|
slide = Slide.where(post_id: post).order('created_at DESC').first
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
当我运行这个时,我得到:NoMethodError: undefined method image' for nil:NilClass
为什么 image
得到 NoMethodError
,我该如何解决?
听起来您的 post
没有任何幻灯片,所以
Slide.where(post_id: post).order('created_at DESC').first
返回 nil
。
只需检查 slide
是否存在即可解决问题。
posts.each do |post|
slide = Slide.where(post_id: post).order('created_at DESC').first
if slide.present?
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
end
但是,如果您的 belongs_to
和 has_many
关系设置正确,您可以稍微简化一下:
posts.each do |post|
if post.slides.any?
slide = post.slides.first
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
end
或者你可以走得更远,只 select 至少有一张幻灯片的帖子:
posts = Post.joins(:slides).uniq
posts.each do |post|
slide = post.slides.first
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
您只需要在代码中加入一个条件。
posts.each do |post|
if post.slides.count > 0
slide = Slide.where(post_id: post).order('created_at DESC').first
post.update(remote_image_url: slide.image_url(:thumb_huge))
end
end
希望对你有用。
在我的应用程序中,我有 Post
和 Slide
个模型。 post has many slides
& slide belongs_to post
.
我所有的幻灯片每张都有一张图片(我正在使用carrierwave gem
上传),但目前有些我的 post 没有图像。
我正在尝试抓取每个 post 的 第一张幻灯片 并在 seed
的帮助下将其图像上传到 post。
这是我在seeds.rb
中尝试过的:
posts = Post.all.where(image: nil)
posts.each do |post|
slide = Slide.where(post_id: post).order('created_at DESC').first
post.update(remote_image_url: slide.image_url(:thumb_huge))
end
AND
posts = Post.all.where(image: nil)
posts.each do |post|
slide = Slide.where(post_id: post).order('created_at DESC').first
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
当我运行这个时,我得到:NoMethodError: undefined method image' for nil:NilClass
为什么 image
得到 NoMethodError
,我该如何解决?
听起来您的 post
没有任何幻灯片,所以
Slide.where(post_id: post).order('created_at DESC').first
返回 nil
。
只需检查 slide
是否存在即可解决问题。
posts.each do |post|
slide = Slide.where(post_id: post).order('created_at DESC').first
if slide.present?
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
end
但是,如果您的 belongs_to
和 has_many
关系设置正确,您可以稍微简化一下:
posts.each do |post|
if post.slides.any?
slide = post.slides.first
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
end
或者你可以走得更远,只 select 至少有一张幻灯片的帖子:
posts = Post.joins(:slides).uniq
posts.each do |post|
slide = post.slides.first
post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}")
end
您只需要在代码中加入一个条件。
posts.each do |post|
if post.slides.count > 0
slide = Slide.where(post_id: post).order('created_at DESC').first
post.update(remote_image_url: slide.image_url(:thumb_huge))
end
end
希望对你有用。