在数组中构建活动记录条件 - 私有方法'scan'称为错误

Nic*_*ick 2 activerecord ruby-on-rails multiple-conditions conditional-statements

我正在尝试使用数组动态构建一组条件,如第一个答案所示:模型中的一个或多个参数使用Ruby on Rails查找条件.然而,我似乎做错了什么,我不确定我正在尝试的是从根本上是不健全的,或者我是否只是拙劣的语法.

我在这里简化到一个单一的条件,试图说明问题,因为我试图在这些线上构建一个简单的概念证明,然后再分层我正在争论的5种不同的条件样式.

这有效:

excluded.push 12
excluded.push 30
@allsites = Site.all(:conditions => ["id not in (?)", excluded])
Run Code Online (Sandbox Code Playgroud)

这导致私有方法'scan'被称为错误:

conditionsSet = []
excluded.push 12
excluded.push 30
conditionsSet << ["id not in (?)", excluded]
@allsites = Site.all(:conditions => conditionsSet)
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议.我不确定是否正确将此作为后续项目放在我在顶部注意到的相关问题/答案中.因为我有一个问题不是答案.如果有更好的方式发布与现有帖子相关的内容,请告诉我.

Har*_*tty 5

试试这个:

Rails 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
Run Code Online (Sandbox Code Playgroud)

现在控制器中的某个地方:

Site.all(:conditions => Site.build_conditions([1,2])) 
Site.all(:conditions => Site.build_conditions(nil, "ABC"))
Run Code Online (Sandbox Code Playgroud)

Rails 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
Run Code Online (Sandbox Code Playgroud)

现在控制器中的某个地方:

Site.exclude_ids_by_name_and_state([1,2])).all 
Site.exclude_ids_by_name_and_state(nil, "ABC").all
Run Code Online (Sandbox Code Playgroud)