2016-08-08 5 views
0

productモデルでは、改行のテキストプロパティがtagsに区切られています。この背後にある理由は、毎日実行されるクエリがあり、これらのフィールドのそれぞれを反復して、製品ごとに正規表現を構築し、できるだけ速くしたいと考えているからです。製品は数ヶ月に1回程度しか追加または更新されないため、検証は効率的である必要はありませんが、私は以前の制限が与えられているほど良いものにしたいと考えています。テキストフィールドの要素の一意性を効率的に検証

def build_regex_string 
    '(' + tags.gsub(/(\r?\n(?!$))/,'|').gsub(/(\r?\n)/,'') + ')' 
end 

def validate_tags_are_unique 
    Product.where.not(id: id).each do |product| 
    tags_regex = Regexp.new(product.build_regex_string) 
    return false if tags_regex.match(tags) 
    end 
end 

すると、私はそれは私が既に持っている方法だ主な理由は、正規表現を使用しています:

は、これまでのところ、私が作ってみた何これです。私は、pSQLの移行に検証を直接記述するのが良いアイデアかどうかを検討しようとしていましたか?私はそれに精通していない。私が調べたもう1つは、代わりに配列型を使用していましたが、配列で必要なものをActiveRecordで検証していないため、配列をビルドしてビルドする時間を無駄にしたくありません。最後に、正規表現をデータベースに実際に格納する方法を検討しましたが、文字列の正規表現を構築する必要があります。

+1

最適化する必要がある現在のコードはどのくらい遅いですか? –

答えて

0

なぜRubyを使用しないのですか? Rubyではとても簡単です。

def validate_tags_are_unique 
    self_tags = tags.split(/\n/) 
    Product.where.not(id: id).tags.all?{ |t| (self_tags - t.split(/\n/)).empty? } 
end 
+0

Product.where.not(id:id)はタグプロパティを持たないコレクションを返すため、正しく動作しません。 – SunnyMagadan

+0

Product.where.not(id:id).all? {| prod | (self_tags&prod.tags.split(/ \ n /))。空ですか? }はより正確です(すべての製品に現在の製品のタグと共通のタグはありません) – SunnyMagadan

+0

私はそれを修正しました。ありがとうございました! – Nathan

関連する問題