My Rails项目有两个类,事件和包。事件有很多包,包属于一个事件。我想知道是否只有当它的包值匹配数组中的所有字符串时才能返回一个事件,使用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
通过此循环,仅返回包含饮料 AND 食品包的事件。不返回仅包含饮料或仅包含食品包装的活动。我想知道是否可以使用SQL查询或ActiveRecord方法获得相同的结果。我已经研究了好几个小时但没有用。
答案 0 :(得分: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}