我在模型 A 和 B 之间有一个多态关联,其中 B.value 可以是:
- 一些可搜索的文本
- 模型 C 的 ID
在 A 的索引中,我声明 indexes B.value
,因此可搜索的文本被索引,但 C 的 ID 也是如此。
如何设置索引,以便也可以按 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
在这种情况下,我可能会在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或可搜索的文本,那么我想这个解决方案是行不通的。
综上所述:如果可能的话,我强烈建议您重新设计数据库,以便列内容更加一致:)
这是我为使其工作所做的:
- 添加了自定义联接
- 使用自定义联接添加了自定义索引
例如,在类 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