Sequel 查找器中的类型转换值

Typecasting values in Sequel finders

我有一个带有数字状态列的模型,该列由模型映射到符号。到目前为止效果很好,但我不能使用 sequel 的查找器机制。

让我们采用这个模型

class Task < Sequel::Model
  finder def self.by_status(status)
    where(status: status)
  end
end

使用此示例数据库:

DB.create_table(:tasks) { primary_key :id; Integer :status }
3.times {|n| DB[:tasks].insert(status: n) }

有了这个,我可以使用 Task.first_by_status(2) 来接收数据集。查找器背后的查询是由 Sequel::Dataset::PlaceholderLiteralizer 机制创建的。

当我添加符号映射时,模型看起来更像这样:

class Task < Sequel::Model
  STATES = {
    0 => :new,
    1 => :busy,
    2 => :done,
    3 => :failed,
  }.freeze

  finder def self.by_status(status)
    where(status: status2id(status))
  end

  def status=(v)
    super self.class.status2id(v)
  end

  def status
    STATES.fetch(super)
  end

  def self.status2id(sym)
    sym = sym.downcase.to_sym
    STATES.key(sym)
  end
end

修改后的 finder 方法不再起作用,因为它在记录阶段将 Sequel::Dataset::PlaceholderLiteralizer::Argument 实例传递给 .status2id

有没有办法在使用这种机制时修改参数?

我认为 Sequel 的 finder 方法不支持您想做的事情。请注意 finder 只是一种优化,您当然可以这样做:

def first_by_status(status)
  by_status(status).first
end