1

複数のフィルターが適用されたSequel データセットがある場合、既存のフィルターの 1 つを削除または上書きする新しいデータセットを作成するにはどうすればよいですか?

ds1 = DB[:x].filter(a:1, b:2)
#=> <Sequel::Dataset: "SELECT * FROM x WHERE ((a = 1) AND (b = 2))">

ds2 = ds1.filter(a:42) # I want to CHANGE a, not add another
#=> <Sequel::Dataset: "SELECT * FROM x WHERE ((a = 1) AND (b = 2) AND (a = 42))">

このSequel::Dataset#unfilteredメソッドはすべてのフィルタを削除します (たとえば、 を削除しb=2ます)。上記の単純なケースでは簡単に再追加できますが、実際のケースではコードの重複が発生します。

4

2 に答える 2

1

主なユースケースではないと思います。おそらくベンチマークを行いたいと思いますが、バインドされた変数を使用できます

# initial args
ds1 = DB[:x].filter(a: :$a, b: :$b).bind(a: 1, b: 2)
ds1.call(:first)  # or :select, :update, et al.

# then later
ds2 = ds1.bind(a: 42)
ds2.call(:first)  # uses a = 42 and b = 2

# or pass the args directly into call()
ds2.call(:first, a: 42)

callバインドされた変数はand と一緒に使用された場合にのみ認識されることに注意してくださいprepareds2.first

于 2013-11-08T21:46:42.150 に答える