思考狮身人面像 - 当第三个模型的 ID 通过多态关联保存为值时,索引第三个模型的名称



我在模型 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或可搜索的文本,那么我想这个解决方案是行不通的。

综上所述:如果可能的话,我强烈建议您重新设计数据库,以便列内容更加一致:)

这是我为使其工作所做的:

  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

最新更新