您要查找的查询类似于:
Profile.where("name LIKE ?", "%#{profiles.name}%")
但请注意,您的@related_profiles 可能未正确分配,因为结果与说的相同:
Profile.where("name LIKE ?", "%#{@favorites.last.name}%")
然而,我怀疑这是否是您所需要的。
另请注意,它将是一个 ActiveRecord::Collection,一个类似对象的数组。
解决此问题的一种方法是初始化@related_profiles = [],然后在循环的每个点上,您可以这样做:
@related_profiles +=
Profile.where("name LIKE ?", "%#{profiles.name}%")
或者另一种方式是:
names = @favorites.map(&:name)
query = names.map{|name| "name LIKE '%#{name}%'"}.join(" OR ")
或
query = @favorites.map{|favorite| "name LIKE '%#{favorite.name}%'" }.join(" OR ")
那么
profiles = Profile.where(query)
更新
根据@joshrumbut 的评论,我决定使用绑定参数重新实现。
但是,代码清晰度有点丢失,但是可以通过以下方式完成:
names = @favorites.map(&:name)
query = names.map{|favorite| "name LIKE ?" }.join(" OR ")
profiles = Profile.where(query, *names.map{|name| ("%#{name}%")})
根据@muistooshort 的评论,我删除了前两个查询中的引号,我认为这种方法看起来更简洁,正如他所建议的那样。来自docs
Profile.where('name like any(array[?])', names.map { |s| "%#{s}%" })