2016-05-22 44 views
0

保存爲值我有機型A和B之間的多態關聯,其中B.value可以是:思考獅身人面像 - 索引第三種模式的名稱時,其ID通過多態關聯

  • 某些搜索文本
  • 模型C的ID

在A的指數,我宣佈indexes B.value,所以搜索的文本索引,但這樣是C.

的ID怎麼辦I S等指數,所以我也可以通過C.name而不是C.id搜索?

class A < ActiveRecord::Base 
    has_many :bs, as: :bable 

    define_index do 
    indexes bs.value, as: :b_value 
    end 
end 

class B < ActiveRecord::Base 
    belongs_to :bable, polymorphic: true 
    # :value -> can be searchable text or C.id 
end 

class C < ActiveRecord::Base 
    # :name -> I want to search by this, not :id 
end 

回答

1

在這種情況下,我可能會成立獨立的協會與上bable_type列條件,然後使用索引定義中的新的關聯。

一個例子(雖然我沒有測試過這一點):

has_many :bs_with_ids, :as => :bable, lambda { where :bable_type => 'B1' } 
has_many :bs_with_values, :as => :bable, lambda { where.not :bable_type => 'B1' } 

然後在指數:

indexes bs_with_ids.c.name, :as => :c_names 
indexes bs_with_values.value, :as => :b_values 

polymorphs bs_with_ids, :to => %w(B1) 
polymorphs bs_with_values, :to => %w(B2 B3) 

現在,我已經寫了這個假設特定類型B的(因爲它是一個多態關聯)具有存儲C id值的值列(並且具有指向該C記錄的關聯) - 在我的示例中,B1 - 和其他類型在value列中存儲可搜索文本(B2,B3)。但是,如果沒有可靠的方法來確定value是否擁有一個ID或可搜索的文本,那麼我想這個解決方案是行不通的。

所有這一切說:如果可能的話,我強烈建議所以列內容多一點一致:)

+0

你是什麼意思?你能提供一個小例子嗎? – Jonathan

+0

我正在考慮在B.value包含C.id時在B中添加一個包含C.name的列。然後我可以添加一個索引到新列。 – Jonathan

+0

^增加了一個例子和一些細節。 – pat

0

這是我做過什麼,使其工作重新加工您的數據庫:

  1. 添加定製加入
  2. 新增使用定製自定義索引加入

例如,在類A中的指數的定義是:

# Custom join with C from the table 'cs': 
join "LEFT OUTER JOIN cs c_value ON c_value.id = bs.value" 

# Custom index based on custom join for when B.value contains C.id: 
indexes "c_value.name", as: :custom_user 

# This remains unchanged for when B.value contains searchable text: 
indexes bs.value, as: :b_value 
相關問題