Ruby on rails 如何使用Mongoid::Slug缓存遗留数据

Ruby on rails 如何使用Mongoid::Slug缓存遗留数据,ruby-on-rails,mongoid,mongoid-slug,Ruby On Rails,Mongoid,Mongoid Slug,我正在使用Mongoid::Slug 我正在尝试更新一组数据,其中一部分是在使用os Mongoid::Slug之前创建的。所以我有一堆对象,它们的_slug=[]和slug.nil?。我想在rake任务中更新这些,但不知何故,我失败得很惨 所有对象都从“title”属性派生其slug slug :title, history: true rake任务: class SlugGenerator def run all_objects = get_array_of_all_obje

我正在使用Mongoid::Slug

我正在尝试更新一组数据,其中一部分是在使用os Mongoid::Slug之前创建的。所以我有一堆对象,它们的_slug=[]和slug.nil?。我想在rake任务中更新这些,但不知何故,我失败得很惨

所有对象都从“title”属性派生其slug

slug :title, history: true
rake任务:

class SlugGenerator

  def run
    all_objects = get_array_of_all_objects

    objects_without_slugs = all_objects.select { |obj| obj.slug.blank? }

    pp "#{objects_without_slugs.count} without Slug."
    objects_without_slugs.each do |obj|
      p "item #{obj.title} has no slug"
      p obj.save
    end

  end

  def get_array_of_all_objects
    all_objects = []
    all_portfolios = Portfolio.all
    all_objects << all_portfolios
    all_items = all_portfolios.map { |p| p.portfolio_items }.flatten #array embedded in portfolio
    all_objects << all_items
    all_images = all_items.map { |item| item.images }.flatten #array embedded in pf_item
    all_objects << all_images
    all_objects.flatten
  end
end  
Portfolio.each do |portfolio|
   portfolio.build_slug
   portfolio.save
end
class-SlugGenerator
def运行
所有对象=获取所有对象的数组
objects_without_slug=所有_对象。选择{| obj | obj.slug.blank?}
pp“#{objects_不带_Slug.count}不带Slug。”
对象_不带_slug。每个对象都有| obj|
p“项#{obj.title}没有slug”
p obj.save
结束
结束
def获取所有对象的数组
所有_对象=[]
all_公文包=公文包.all

所有对象我都遇到了相同的问题,并通过添加

set_callback :update, :before, :build_slug
set_callback :save,   :before, :build_slug
给我的模特


在那之后,我只是在rails控制台中运行了我的所有实体,将“updated_at”字段更新为DateTime。现在保存它,瞧!slug已经创建。

假设您有model
公文包
并且您需要为所有遗留对象添加slug,那么您只需要在console中运行它,或者您可以执行新的rake任务:

class SlugGenerator

  def run
    all_objects = get_array_of_all_objects

    objects_without_slugs = all_objects.select { |obj| obj.slug.blank? }

    pp "#{objects_without_slugs.count} without Slug."
    objects_without_slugs.each do |obj|
      p "item #{obj.title} has no slug"
      p obj.save
    end

  end

  def get_array_of_all_objects
    all_objects = []
    all_portfolios = Portfolio.all
    all_objects << all_portfolios
    all_items = all_portfolios.map { |p| p.portfolio_items }.flatten #array embedded in portfolio
    all_objects << all_items
    all_images = all_items.map { |item| item.images }.flatten #array embedded in pf_item
    all_objects << all_images
    all_objects.flatten
  end
end  
Portfolio.each do |portfolio|
   portfolio.build_slug
   portfolio.save
end

在没有slug的对象上调用“buildæu slug()”方法。@AndreasSæbjørnsen,这是不可行的。到目前为止,解决这个问题的唯一方法是克隆对象,删除原始对象并重新连接克隆。我就这样丢了身份证,所以我对此不满意,但这是我能想到的最好的办法。这不必要,而且有点不幸。您是否验证了文档是否正确保存?您是否有一些验证正在通过错误停止保存?它们进行验证,在pry中,我可以保存它们。看来是这样。一旦我重新加载数据,就不会保存任何内容。这真的很奇怪,甚至可能是一个mongoid或mongodb错误…您在mongodb控制台中看到任何错误吗?我建议在rails conmmandline上的单个文档上设置slug并保存它。保存后运行有效吗?方法,以确保模型正确保存,然后检查mongodb日志。