如何使用Mongoid :: Slug来淡化遗留数据

时间:2014-09-09 21:07:43

标签: ruby-on-rails mongoid mongoid-slug

我正在使用Mongoid :: Slug https://github.com/digitalplaywright/mongoid-slug

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

所有对象都从'title'属性派生出slu。

slug :title, history: true

佣金任务:

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  

保存返回true。尽管如此,这些对象仍然没有slu。即使我在保存之前更改了标题,我也没有得到任何不同的结果。

我缺少什么

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并通过添加

解决了这个问题
set_callback :update, :before, :build_slug
set_callback :save,   :before, :build_slug

到我的模特。

之后,我刚刚在rails控制台中运行了所有实体,将'updated_at'字段更新为DateTime.now保存了它,瞧!已经创造了slu ..

答案 1 :(得分:0)

假设您有模型Portfolio,并且您需要为所有旧对象添加slug,那么您只需要在控制台中运行它,或者您可以进行新的rake任务:

Portfolio.each do |portfolio|
   portfolio.build_slug
   portfolio.save
end