私はPostgreSQLでRailsアプリケーションを持っています。効率的なスラックのようなサブドメイン名の提案を実装する
ユーザー入力が既に選択されている場合、特定のリソースの代替名を提案する方法を実装しようとしています。
私の参照が緩みです:
は、これを効率的に行うことができます任意の解決策はありますか?効率的にするために
I意味:クエリの一つだけかも小さなセットを使用しました。 A 純粋なSQLソリューションしかし、素晴らしいだろう。
私の最初の実装は、このように見えた:
def generate_alternative_names(model, column_name, count)
words = model[column_name].split(/[,\s\-_]+/).reject(&:blank?)
candidates = 100.times.map! { |i| generate_candidates_using_a_certain_strategy(i, words) }
already_used = model.class.where(column_name => candidates).pluck(column_name)
(candidates - already_used).first(count)
end
# Usage example:
model = Domain.new
model.name = 'hello-world'
generate_alternative_names(model, :name, 5)
# => ["hello_world", "hello-world2", "world_hello", ...]
それは100人の候補を生成し、その後、一致するデータベースをチェックし、候補者リストから削除します。最後に、最初のcount
値を返します。
ベストプラクティスの実装は、少数の提案に対して機能し、競合がほとんどない(私の場合は100回の競合)ので、ベストエフォート型の実装です。
このマジックナンバー(100)を増やしても、無期限に縮尺されません。
これを改善する方法を知っていますか?多数の競合やマジックナンバーを使用せずに拡張できる方法はありますか?
あなたのメソッドは単一の 'where ... in'クエリを使用します。それは正確に**一度**データベースに当たる。あなたが何を求めているのか分かりませんが、これを行うための既製品の宝石であれば、Stack Overflowの話題にはなりません。 – meagar
@magagarもちろん、ソリューションは競合が100未満の場合にのみ機能します。私がより多くの候補を生成しても、無制限に拡張することはありません。より良い方法があると確信しています。 :) – ProGM