Rails: метод сцепления в модели - PullRequest
1 голос
/ 11 февраля 2011

Попытка создать метод поиска в моей модели и объединить условия на основе аргументов, переданных методу.Тем не менее, после начального «где»

Контроллер ничего не связывает:

Item.search(args)

Модель:

  def self.search(args = {})
    include ActsAsTaggableOn # Tagging model for search

    result = where("title LIKE ? OR description LIKE ? OR tags.name LIKE ?", "%#{args[:search]}%", "%#{args[:search]}%", "%#{args[:search]}%")
      .joins("JOIN taggings ON taggings.taggable_id = items.id")
      .joins("JOIN tags ON taggings.tag_id = tags.id")

      # Categories
      if args[:categories]
        result.where(:category_id => args[:categories])
      end

      # Order
      if args[:order] == "category"
       result.joins(:categories).order("categories.title ASC")
      else
        result.order("title DESC")
      end


      # Pagination
      result.paginate(:per_page => 10, :page => args[:page])

end

Даже если я удаляю блок if и выполняюцепочка сразу после этого не работает:

result = where(:foo => "bar")
result.order("name DESC")

... работает только где.

Есть идеи?

Заранее спасибо.

1 Ответ

3 голосов
/ 11 февраля 2011

Что вам нужно сделать, это связать его, корректируя определение result по ходу дела:

result = result.where(...)

Каждый раз, когда вы должны переназначать результат, чтобы получить результат с обновленной областью действия.Это связано с тем, что result.where возвращает новую область, но не корректирует существующую область.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...