Sequel finders中的类型值

时间:2016-03-15 14:03:45

标签: ruby casting 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

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

1 个答案:

答案 0 :(得分:2)

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

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