在rails中,如何构建一个高级查询表单?
悬赏:20 发布时间:2008-07-04 提问人:j2j2 (初级程序员)
我想说的就是在一个表单中有多个查询条件,如果输入了关键字,就查,不输入就不查询,说简单一点,就是怎么样动态构建查询条件?
请大家指教!
请大家指教!
采纳的答案
2008-07-04 qichunren (资深程序员)
提问者对于答案的评价:
我觉得这个视频不错,不错更不错的是某个回复中提到了Where的插件(加10分.).那个插件很好使用.谢谢了.也感觉其它的回答.
额外加分:10
其他回答
楼上的解答还不错,不过感觉上仍然比较麻烦.
首先得明确这些条件的关系(AND,OR,NOT),其次遴选出这些条件的构造方案.譬如一些是大小关系方案,一些是包含关键字方案什么的.这些我认为必须由程序员自己定义,先面的问题是能否运用ROR的设计理念来动态构建查询方案.
根据在JAVA等静态语言的编码工作,当时的思路是利用RTTI反射机制提取内部变量,然后按照命名规则调用查找方案.在这里同样可以使用类似于反射的方式(调用相关的数据库),然后登记各变量,然后按照惯例调用方法,并组合最终结果.
以上api是讲反射机制的.
然后再动态调用方法.
在Ruby,你只一行代码就可做到这些。把你的命令行函数放到一个类中,创建那个类一个实例(我们称它为命令),然后请求那个对象运行一个调用与命令字答串相同名字的方法。
commands.send(command_string)
利用这两点我感觉你可以自己封装这些调用了.
封装建议:
将方法和调用统一放装到model层中.然后通过参数传递进去.
首先得明确这些条件的关系(AND,OR,NOT),其次遴选出这些条件的构造方案.譬如一些是大小关系方案,一些是包含关键字方案什么的.这些我认为必须由程序员自己定义,先面的问题是能否运用ROR的设计理念来动态构建查询方案.
根据在JAVA等静态语言的编码工作,当时的思路是利用RTTI反射机制提取内部变量,然后按照命名规则调用查找方案.在这里同样可以使用类似于反射的方式(调用相关的数据库),然后登记各变量,然后按照惯例调用方法,并组合最终结果.
#Reflections on columns, associations, and aggregations reflection = Firm.reflect_on_association(:clients) reflection.klass # => Client (class) Firm.columns # Returns an array of column descriptors for the firms table
以上api是讲反射机制的.
然后再动态调用方法.
引用
在Ruby,你只一行代码就可做到这些。把你的命令行函数放到一个类中,创建那个类一个实例(我们称它为命令),然后请求那个对象运行一个调用与命令字答串相同名字的方法。
commands.send(command_string)
利用这两点我感觉你可以自己封装这些调用了.
封装建议:
将方法和调用统一放装到model层中.然后通过参数传递进去.
qianjigui (初级程序员) 2008-07-04
如果用2.1的话,用1楼的方法。如果不是,给你个新方法:
用法
def make_conditions(parts)
parts.compact!
return nil if parts.empty?
conditions_clauses = parts.map { |condition| condition.first }
conditions_options = parts.map { |condition| condition[1..-1] }.flatten
[conditions_clauses.join(' AND '), *conditions_options]
end
用法
conditions = [] conditions << [" col1 = ?", 1] if params[]... conditions << [" col2 = ?", 1] if params[]... ... find :all, :conditions => make_conditions(conditions)
caryl (初级程序员) 2008-07-05




