Rails在类方法链中处理Nil

时间:2016-05-30 03:57:18

标签: ruby-on-rails activerecord

我有以下Search类方法,它接受一堆参数,然后构建一个请求。

def self.search(agent, params)
  RealPropertySale.where(id: available_ids)
                      .joins(:address)
                      .by_state(state)
                      .by_suburb(suburb)
                      .by_post_code(post_code)
                      .by_country(country)
                      .paginate(page: page)
end

def self.by_state(state)
  where(addresses: {state: state})
end

def self.by_suburb(suburb)
  where(addresses: {suburb: suburb})
end

def self.by_post_code(post_code)
  where(addresses: {post_code: post_code})
end

def self.by_country(country)
  where(addresses: {country: country})
end

如果我的一个自定义类方法处理的正确方法是什么,例如self.by_country(country)返回nil,以便查询继续存在任何param / s。我已经尝试返回self,如果一个params为空但查询丢失并且返回类导致错误。

2 个答案:

答案 0 :(得分:2)

我同意@Michael Gaskill你可能只应该调用实际影响最终查询的范围(即具有有意义的参数)。

但是,如果您坚持忽略nil参数的范围,您可以将它们返回current_scope而不是(这是undocumented但有用的方法) :

def self.by_state(state)
  return current_scope if state.nil?
  where(addresses: {state: state})
end

答案 1 :(得分:1)

我们做了类似的事情,将其分解为:

response = RealPropertySale.where(id: available_ids)
                  .joins(:address)
response = response.by_state(state)          if state
response = response.by_suburb(suburb)        if suburb
response = response.by_post_code(post_code)  if post_code
response = response.by_country(country)      if country
response = response.paginate(page: page)     if page

我喜欢可读性。我尝试根据需要将其分解为多个部分,但这应该适应您的业务逻辑。不知道,对你来说,检查是否提供郊区是有意义的。