次のような「埋め込みの1対多」モデルがあります。
class User
include Mongoid::Document
field :nickname
embeds_many :watchlists
end
class Watchlist
include Mongoid::Document
field :html_url
field :description
field :tags_array, type: Array
embedded_in :user
end
および次のようなクエリの「基準」:
User.where('watchlists.tags_array' => %w[ruby web framework])
問題は、「watchlists.tags_array」によって提示される単語の「正確な」シーケンスにのみ一致することですが、「ruby」、「web」、および「framework」のすべての順列に一致させたいのです。
元。:
%w[ruby web framework] のような配列の場合、次のすべての順列に一致する必要があります。
ruby web framework
ruby framework web
framework web ruby
framework ruby web
web framework ruby
web ruby framework
それは可能ですか?どうやってやるの ?
アップデート:
クエリはもう少し複雑でした(単純化しようとしていました)。ネストされた種類の抽出と順列は、私のソリューションでもセルジオ・トゥレンツェフのソリューションでも機能しません。どちらの場合も、正確な配列と一致するだけです。
Object.const_set :Competitor, Struct.new(:html_url, :description, :watchers, :forks)
def self.find_competitors(tags_array)
competitors = []
# doesn't work: User.where('watchlists.tags_array' => tags_array).only(:watchlists).each do |u|
User.all_in('watchlists.tags_array' => tags_array).only(:watchlists).each do |u|
u.watchlists.where(:tags_array => tags_array).each do |wl|
competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
end
end
return competitors
end
アップデート:
同じ ' all_in criteria ' が内側の cicle にも含まれていないだけです...そして、順列も正常に機能します:
User.all_in('watchlists.tags_array' => tags_array).only(:watchlists).each do |u|
u.watchlists.all_in(:tags_array => tags_array).each do |wl|
competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
end
end