我有以下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为空但查询丢失并且返回类导致错误。
答案 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
我喜欢可读性。我尝试根据需要将其分解为多个部分,但这应该适应您的业务逻辑。不知道,对你来说,检查是否提供郊区是有意义的。