我正在爲我的網頁擴展搜索功能。變量作用域的定義和繼承
我看着ransack,但它缺少一些我需要的功能,使url查詢字符串非常長,並且有一些錯誤(報告)。
因此我開始實施自己的黑客攻擊。
首先我想介紹我的想法,事後我想問問如何解決我的問題,最後如果有其他方法可以改善這一問題。
的想法:
甲模型定義像這樣(此外,該模型是發動機內):
module EngineName
class Post < ActiveRecord::Base
search_for :name, :as => :string do |b, q|
b.where{name =~ "%#{q}%"}
end
end
end
:名稱是定義查詢-PARAM使用例如這將是?q [name] =東西 我知道這不是完全通用的像ransack,但是...
:作爲建立正確的形式標籤。 :字符串用於text_field,:用於number_field的整數等等。我想進一步擴展它以實現爲關聯等自動生成集合。
現在該塊是一個簡單的使用範圍。 在構建複雜查詢(比如count()等)時,我遇到了幾個缺點與快速搜索。現在我可以在squeel中指定我自己的優化查詢。
我擴展了ActiveRecord :: Base來設置邏輯(全局的,不在引擎內部,我想在任何地方使用它)。 我定義了一個範圍:搜索,所以我可以像使用ransack一樣使用Model.search(param [q])。 此外,我試圖保留一個由search_for調用定義的「可搜索」鍵的列表。
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
現在的問題:
請看看範圍的第二行:搜索。
在那裏我打電話給我簡單的Proc我定義上面只包括「範圍」 這是爲了得到一個問題,自我返回「ActiveRecord :: Base」,而不是像「Post」或「Comment 」。
這是因爲範圍在繼承上的基類上調用,但我沒有找到任何解決方法。
由於在模型本身(例如Post)上調用search_for,所以返回的範圍模型是「正確的」。
有誰知道如何規避這個?
接下來的問題是,如何存儲「可搜索」範圍列表。我用@@變量。但是,因爲它們在每個子類中共享,這將是一個不可行的過程。 但是,它需要是靜態的,因爲search_for是在不初始化實例的情況下調用的(不是嗎?)
最後但並非最不重要的是,始終指定要在每個範圍上使用的基本模型以便我可以將它們鏈接在一起,這是非常可怕的。
有沒有其他的可能性來改善呢?
請或不使用在您的文章簽名或標語(HTTP:/ /stackoverflow.com/faq#signatures)。 – meagar