Вы можете сделать это следующим образом:
group = Listings.all.joins(:spec).where('specs.agent ilike ?', '%smith%') +
Listings.all.joins(:spec).where.not('specs.agent ilike ?', '%smith%')
Таким образом, на групповую переменную будут сначала помещаться те, которые соответствуют условию, а после них - те, которые не
* 1005.* РЕДАКТИРОВАТЬ: не знаю точно, почему вам нужен отдельный метод для этого (так как способ, который я показал раньше, даст вам правильный порядок в любом случае).Но есть проблема с синтаксисом, который вы показали при редактировании: вы пытаетесь вызвать метод экземпляра, который вызывает весь метод ActiveRecord где (та же проблема, что и в ответе steenslag).Если вы хотите сделать так, как вы представили, я думаю, что этот способ должен работать лучше:
#this method should be on Listing model
def get_smith_listings?
self.spec.broker.to_s.include?("smith")
end
@listings = Listings.includes(:spec).all #important to avoid n+1 queries
# here the 0 or 1 position will depende the true/false order you want
@listings.sort_by { |item| item.get_smith_listings? ? 0 : 1 }
Я до сих пор не понимаю, почему вы хотите сделать это так, и думаю, что, вероятно, есть лучший способ сделать то, что выхочу ... но сейчас я не могу помочь больше, чем это.Удачи!