ruby – 变量范围定义和继承
我正在为我的网页开发扩展搜索功能.
我看了ransack,但是它缺少我需要的一些功能,使得url-query字符串很长并且有一些错误(报告). 因此我开始实施自己的黑客攻击. 首先,我想提出我的想法,之后我想问一下如何解决我的问题,最后是否有其他方法可以改善这个问题. 想法: 模型定义了这样的东西(另外,模型在引擎内): module EngineName class Post < ActiveRecord::Base search_for :name,:as => :string do |b,q| b.where{name =~ "%#{q}%"} end end end :name用于定义要使用的查询参数,例如:这将是?q [name] =某事 :就像建立正确的表单标签一样. :string将用于text_field,:integer用于number_field,依此类推.我想进一步扩展它以实现为关联等自动生成集合. 现在该块是一个简单的使用范围. 我扩展了ActiveRecord :: Base来设置逻辑(全局的,不在引擎内部.我想在任何地方使用它). class ActiveRecord::Base @@searchable_attributes = Hash.new({}) def self.search_for(name,*opts,&search_scope) return unless search_scope @@searchable_attributes[name] = { :type => opts[:as],:condition => search_scope } unless @@searchable_attributes.has_key? :nil @@searchable_attributes[:nil] = Proc.new { scoped } end end scope :search,lambda {|q| next unless q.kind_of?(Hash) base = @@searchable_attributes[:nil].call q.each do |key,search| next unless base.class.searchable_attributes.has_key?(key) base = @@searchable_attributes[key][:condition].call(base,search) end base } end 现在的问题: 它主要与类的继承有关.但即使在阅读并尝试3,4之后它也无效. 请查看范围中的第二行:搜索. 在那里,我称之为简单的Proc我在上面定义,其中只包括“范围” 这是因为在继承上在Base类上调用了scope,但是我找不到任何解决这个问题的方法. 当在模型本身(例如Post)上调用search_for时,返回的范围模型是“正确的”. 有谁知道如何规避这个? 接下来的问题是,如何存储“可搜索”范围列表.我用@@变量.但是因为它们在每个子类中共享,所以这将是一个禁忌. 最后但并非最不重要的是,总是指定要在每个范围内使用的基础模型,以便我可以将它们链接在一起,这有点可怕. 还有其他可能性来改善这个吗? 解决方法
好吧,似乎我最终得到了它,我将其他问题的其他几个答案放在一起.
模型: module EngineName class Post < ActiveRecord::Base searchable search_for :name,q| b.where{name =~ "%#{q}%"} end end end 我的“插件”目前作为初始化程序: class ActiveRecord::Base def self.searchable include Searchable end end module Searchable def self.included(base) base.class_eval { @@searchable_attributes = Hash.new({}) def self.search_for(name,opts) return unless block_given? @@searchable_attributes[name] = { :type => opts[:as],:condition => Proc.new } end # Named scopes scope :search,lambda {|q| next unless q.kind_of?(Hash) base = self.scoped q.each do |key,search| key = key.to_sym next unless @@searchable_attributes.has_key?(key) base = @@searchable_attributes[key][:condition].call(base,search) end base } } end end 希望它能帮助其他人解决同样的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |