Как искать в этом примере activerecord? - PullRequest
0 голосов
/ 28 мая 2010

Две модели:

Счет

  :invoice_num        string
  :date               datetime
  .
  .
  :disclaimer_num     integer (foreign key)

Ответственность

  :disclaimer_num     integer
  :version            integer
  :body               text

Для каждого disclaimer существует несколько версий, которые будут храниться в базе данных. Вот как я пишу поиск (упрощенно):

scope = Invoice.scoped({ :joins => [:disclaimer] })
scope = scope.scoped :conditions => ["Invoice.invoice_num = ?", "#{params[:num]}"]
scope = scope.scoped :conditions => ["Disclaimer.body LIKE ?", "%#{params[:text]}%"]

Однако приведенный выше поиск снова произведет поиск всех версий заявления об отказе. Как я могу ограничить поиск только последним заявлением об отказе (т. Е. Целое число version является максимальным).

Обратите внимание:

Счет-фактура не сохраняет номер версии. Новые отказы от ответственности будут добавлены в таблицу отказа от ответственности и сохранят старые версии.

Ответы [ 3 ]

2 голосов
/ 01 июня 2010

Если вы хотите, чтобы только счета с последней версией из заявления об отказе от ответственности, поставьте условие на disclaimer_num. И я также предлагаю создать вспомогательный метод в Disclaimer, чтобы сделать код чище в вашей области.

class Disclaimer < ActiveRecord::Base
  def latest
    find(:first, :order => "version DESC")
  end
end

scope = scope.scoped :conditions => { :disclaimer_num => Disclaimer.latest }

И я действительно надеюсь, что для краткости вы удалили код предотвращения инъекций SQL из своей области.

0 голосов
/ 03 июня 2010

Добавьте эти два условия (можно сделать в области видимости):

"ORDER BY disclaimer.disclaimer_num DESC"
"LIMIT 0, 1"
0 голосов
/ 01 июня 2010

Хм ... Я мог бы просто быть удовлетворен хранимой процедурой, но я думаю, что в этот момент вы бы очень выиграли от хранимой процедуры (или даже представления), которая выполняла что-то вроде этого:

СОЗДАНИЕ ПРОЦЕДУРЫ GetRecentDisclaimer @BodyFragmentBeingSearched varchar (200) КАК ВЫБЕРИТЕ МАКС (версия), disclaimer_num, body ОТ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ГДЕ body LIKE @BodyFragmentBeingSearched GROUP BY дисклеймер_нум, корпус

Оттуда кто-то написал блог о том, как вы вызываете хранимую процедуру в Rails и заполняете объекты ActiveRecord, посмотрите здесь:

http://nasir.wordpress.com/2007/12/04/stored-procedures-and-rails-part-2/

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