0

我正在尝试做类似的事情:

if filter_1
  @field = @field.where()
else
  @field = @field.where()
end

if filter_2
  @field = @field.order()
end

etc.

但是如何@field使用空查询进行初始化?我试过@field = Field.all了,但这给出了一个数组,所以不允许链接。

4

2 回答 2

2

尝试scoped模型类,例如

@fields =  Field.scoped
@fields = @fields.where("your conditions") if filter_1
@fields = @fiels.order("your conditions") if filter_2
于 2012-09-10T08:08:22.817 回答
1

第一次初始化@field实例变量,请尝试引用类Field,即

过滤器1:@field = Field.where(...)

之后,如果您需要继续添加更多过滤器,您可以根据需要多次引用您的变量字段。

过滤器2向前:@field = @field.where(...)

由于 Filter1 将返回一个活动的 Record 关系,您可以在其上嵌套更多的条件子句。也不必担心性能问题,因为 SQL 只会在实际需要时生成和处理。(延迟加载)

如果您在过滤器的末尾添加@field.to_sql,您将能够看到所有 where 子句都方便地嵌套在一个 SQL 语句中。

另外,我建议您阅读Active Record Query Interface

编辑

创建一个方法 get_field。并使用它来添加过滤结果。

def get_field(field)  
  @field.is_a?(ActiveRecord::Relation) ? Field : field
end


get_field(@field).where(....) 
get_field(@field).where(....)
于 2012-09-10T08:16:28.380 回答