建立活动记录的条件下在一系列私法"扫描"所谓的错误
题
我试图建立一个设定的条件,动态使用一系列建议,在第一个回答: 一个或多个参数模型找到的条件与红宝石在轨道上.然而,我似乎是这样做的东西不正确而且我不知道如果我试图是根本不健全,或者如果我只是botching我的语法。
我简化下一个单一的条件在这里,试图说明这一问题,因为我已经试图建立一个简单的概念证明沿着这些路线前层在5个不同的条件样式我争。
这个工作:
excluded.push 12
excluded.push 30
@allsites = Site.all(:conditions => ["id not in (?)", excluded])
这种结果在一个私人的方法"扫描"所谓的错误:
conditionsSet = []
excluded.push 12
excluded.push 30
conditionsSet << ["id not in (?)", excluded]
@allsites = Site.all(:conditions => conditionsSet)
谢谢你的任何建议。我不确定如果适当的事情就是把这个作为一个后续项目的相关的问题的答案,我注意到在上面。因为我有一个问题没有答案。如果有一个更好的方式来发布此相关的现有后请让我知道。
解决方案
试试这个:
轨2.3
class Site < ActiveRecord::Base
def self.build_conditions(ids, name=nil, state=nil)
cond = []
cond << send(:sanitize_sql_array, ["id NOT IN (?)", ids]) unless ids.empty?
cond << send(:sanitize_sql_array, ["name = ? ", name]) unless name
cond << send(:sanitize_sql_array, ["state = ? ", state]) unless state
cond.join(" and ")
end
end
现在的地方是在你的控制器:
Site.all(:conditions => Site.build_conditions([1,2]))
Site.all(:conditions => Site.build_conditions(nil, "ABC"))
轨3
class Site < ActiveRecord::Base
def self.exclude_ids_by_name_and_state(ids, name=nil, state=nil)
result = scoped
result = result.where("id NOT IN (?)", ids) if ids.present?
result = result.where(:name => name) if name.present?
result = result.where(:state => state) if state.present?
result
end
end
现在的地方是在你的控制器:
Site.exclude_ids_by_name_and_state([1,2])).all
Site.exclude_ids_by_name_and_state(nil, "ABC").all
其他提示
你想要的:
conditionsSet += ["id not in (?)", excluded]
代替:
conditionsSet << ["id not in (?)", excluded]
+=
添加两个阵列在一起(认为它作为合并两个成一个阵)的同时 <<
推动一个新的元素上阵列。所以您得到: [["id not in (?)", excluded]]
当使用 <<
, , :conditions
想要一系列这第一个元素是一个串(不阵列)。
尝试 SmartTuple, 它是专门设计的情况下这样。
def self.build_conditions(options = {})
[
SmartTuple.new(" AND "),
(["id NOT IN (?)", ids] if options[:ids].present?),
({:name => options[:name]} if options[:name].present?),
({:state => options[:state]} if options[:state].present?),
].sum.compile
end
...
Site.all(:conditions => Site.build_conditions(:ids => {1,2]))
Site.all(:conditions => Site.build_conditions(:name => "abc", :state => "disabled")
对我来说还比较好用 options
哈希而不是订购的论点。作为项目的增长,更多的条件,可能会出现,你会失去追踪其来。哈希看起来和更清晰的行为加上你可以很容易地对其进行验证,以避免的软件错误。
不隶属于 StackOverflow