我试图建立一个设定的条件,动态使用一系列建议,在第一个回答: 一个或多个参数模型找到的条件与红宝石在轨道上.然而,我似乎是这样做的东西不正确而且我不知道如果我试图是根本不健全,或者如果我只是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 哈希而不是订购的论点。作为项目的增长,更多的条件,可能会出现,你会失去追踪其来。哈希看起来和更清晰的行为加上你可以很容易地对其进行验证,以避免的软件错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top