Ruby on Rails - 种子未定义方法错误

Ruby on Rails - Seed undefined method error

在我的应用程序中,我有 PostSlide 个模型。 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_tohas_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

希望对你有用。