我的html代码中有5个选择。我将它们发送给控制器,但是例如它们中的一些可能是空的(默认值为0),所以例如在某些情况下我只需要通过params[:size]
进行搜索仅在某些情况下通过params[:capacity]
和在其他params[:size] and params[:capacity]
中也是......但是怎么做到这一点?如何使用find等操作?
现在我有这样的事情:
size = "*"+params[:akbsize]+"*"
@accums = Accumulator.find(:all, :conditions => ["MATCH(description) AGAINST (? in boolean mode)", size])
cap = "*"+params[:akbcapacity]+"*"
@accums2 = Accumulator.find(:all, :conditions => ["MATCH(description) AGAINST (? in boolean mode)", cap])
但是我怎么做?在这里用元搜索宝石做好事吗?
答案 0 :(得分:1)
你可以像这样制作方法:
class Accumulator
def self.by_size(size)
if size
where("description LIKE ?", "%#{size}%")
else
scoped
end
end
def self.by_capacity(capacity)
if capacity
where("description LIKE ?", "%#{capacity}%")
else
scoped
end
end
end
然后在您的控制器上:
@accums = Accumulator.by_size(params[:size]).by_capacity(params[:capacity])
这将实现你想要的。我认为这种方法根本就没有必要。
=)
答案 1 :(得分:0)
sterms = [params[:a],params[:b],params[:c]].select {|t| t}.join('%')
results = Accumulator.where("description like ?", "%#{sterms}%")
或者您可以像这样使用布尔搜索
sterms = [params[:a],params[:b],params[:c]].select {|t| t}.map {|t| '+' + t}.join(' ')
results = Accumulator.where("MATCH(description) AGAINST( ? in boolean mode) ", sterms)
或者如果您正在搜索描述,其中任何通过搜索条件的参数将产生匹配,您可以这样做:
sterms = [params[:a],params[:b],params[:c]].select {|t| t}.join(' ')
results = Accumulator.where("MATCH(description) AGAINST( ? in boolean mode) ", sterms)
这些假设只是没有params,即nil。如果您想使用特定值表示空,请更改.select,即
sterms = [params[:a],params[:b],params[:c]].select {|t| t != "0"}.join('%')
正如您所看到的,我可以继续使用搜索逻辑的各种排列和组合,这就是为什么我建议找到某种形式的元搜索宝石。