Rails 4中的Rails 2 with_scope

时间:2014-07-25 11:45:39

标签: ruby-on-rails ruby

现在我正在将Rails 2应用程序迁移到Rails 4,我在移植with_scope

时遇到问题

Rails 2中的示例方法:

def foo
  with_scope(find: { conditions: { status: 4 }}, create: { status: 2 }) do
    yield
  end
end

在Rails 4中我可以这样做:

def foo
  where(status: 4).scoping { yield }
end

在此块中,当我创建新记录时,status属性将分配给4,但我需要在创建status时将status分配给2 4查询时。

如何在Rails 4中做到这一点?

2 个答案:

答案 0 :(得分:1)

这是未经测试的,但您可以使用ActiveRecord::Relation#first_or_create

def foo
  where(status: 4).first_or_create(status: 2) do
    yield
  end
end

作为警告:

  

如果提供了一个块,那么只有在创建新实例时才会执行该块。该块在现有记录上执行 NOT

答案 1 :(得分:0)

看起来你已经查询了部分。我通常会使用status列的默认值来处理创建案例。迁移包括:

change_column_default :table_name, :status, 2

应该这样做。