2017-03-07 11 views
0

My Railsプロジェクトには、イベントの2つのクラスがあります。。イベントには多くのパッケージがあり、パッケージは1つのイベントに属します。パッケージの値が配列内のすべての文字列と一致する場合(Railsメソッドまたは未処理SQLのいずれか)にのみイベントを返すことができるかどうかは疑問です。私は現在、すべてのイベントを取得し、それぞれのループをいくつか検索してこれを達成しています。このループでは文字列を含む子オブジェクトの値に基づく親オブジェクトの検索

packages = ["beverage", "food"] 
    @events = Event.where('started_at >= ?', DateTime.now).order(started_at: :asc) 
    saved_events = [] 
    @events.each do |event| 
    package_counter = 0 
    event.packages.each do |package| 
     if packages.include? package.kind 
     package_counter += 1 
     if saved_events.include? event 
      break 
     end 
     end 
    end 
    if package_counter == packages.length 
     saved_events.push(event) 
    end 
    end 

    @events = saved_events 

、飲料のみのイベント食品パッケージが返されます。飲み物のみ、または食品パッケージのみのイベントは返されません。 SQLクエリやActiveRecordメソッドで同じ結果を得ることが可能かどうか疑問に思っています。私は無駄に数時間のために研究してきました。

答えて

0

これはRubyでも動作します。すべてのイベントとすべてのパッケージが含まれているため、少しコストがかかりますが、データのサイズによってはかなり速いかもしれませんが、理解して維持するのは簡単です。

@packages = ["beverage", "food"] 

# includes packages 
@events = Event.includes(:packages).where('started_at >= ?', DateTime.now).order(started_at: :asc) 

# this will select and return those events who have the package kinds 
# found in a 'packages' array. The '&' is array intersection 
@events.select{|event| (event.packages.map(&:kind) & @packages) == @packages} 
+0

イベントのパッケージが@packagesと同じ順序でない場合を除き、これは機能します。これを修正するために、 '@ events.select {| event | (event.packages.map(&:kind)&@packages)== @packages} '行を作成して' @ events.select {| event | (event.packages.order(kind::asc).map(&:kind)&@packages)== @packages} ' –

関連する問題