我有一个带有数字状态列的模型,该列由模型映射到符号。到目前为止这种方法效果很好,但我不能使用续集的查找器机制。
让我们采用这个模型
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
。
有没有办法在使用这种机制时修改参数?
答案 0 :(得分:2)
我不认为Sequel的finder
方法支持您想要做的事情。请注意,finder
只是一种优化,您当然可以这样做:
def first_by_status(status)
by_status(status).first
end