Rails find не включается при добавлении аргументов - PullRequest
2 голосов
/ 31 августа 2009

Я надеюсь, что здесь что-то не так, и кто-то может указать мне правильное направление ...

Я написал метод внутри одной из моих моделей, вот код:

def self.find_by_user_id(user_id, *args)
    self.find(:all, :joins => :case_map,
       :conditions => ['case_maps.uer_id = ? and case_maps.case_id = cases.id', user_id], 
        *args)
end

Я могу назвать код так, как он работает:

Case.find_by_user_id(some_user_id)

Однако, когда этот код выполняется с любыми дополнительными аргументами, например:

Case.find_by_user_id(some_user_id, :limit => 15)

Я возвращаю ВСЕ дела. Запрос в моем файле журнала показывает, что он выполнил это:

Case Load (0.6ms)   SELECT * FROM `cases` LIMIT 15

Я даже поместил сообщение logger.info в этот метод, чтобы убедиться, что он выполняется ... Кажется, что когда * args не равен nil, он пропускает все условия и объединения, которые я добавил в поиск и просто использует * args.

Кто-нибудь видит что-то, что я делаю не так?

1 Ответ

3 голосов
/ 01 сентября 2009

AR :: B # find ожидает переменное число аргументов, но last из них должно быть хэшем опций. Он использует Array#extract_options!, и вы тоже можете:

def self.find_by_user_id(user_id, *args)
  options = args.extract_options!
  options.merge!(:joins => :case_map, :conditions => 
    ['case_maps.uer_id = ? and case_maps.case_id = cases.id', user_id])
  self.find(:all, *args, options)
end

Но ты не должен. Какие возможные значения имеют смысл между полями: all и options?

Что вы действительно ищете:

def self.find_by_user_id(user_id, options)
  self.find(:all, options.merge(:joins => :case_map, :conditions => 
    ['case_maps.user_id = ? and case_maps.case_id = cases.id', user_id]))
end

Или еще лучше:

named_scope :find_by_user_id, lambda{|user_id|
  {
    :joins => :case_map,
    :conditions => ['case_maps.user_id = ? and case_maps.case_id = cases.id', user_id]
  }
}

Именованная область действия гарантирует, что все ваши параметры будут аккуратно объединены (все ваши условия будут применены, даже если вы добавите больше позже). Затем вы можете позвонить с помощью:

Case.find_by_user_id(user_id).all(:limit => 15)

(Именованные области видимости - «Да Бом». Их следует использовать как можно больше. Даже в общем разговоре. Например, если вы были здесь в моем доме вчера вечером, вы, возможно, подслушали эту маленькую заметку: Вы хотите на ужин? »,« То же самое, что у меня есть каждую ночь, Именные области и чипсы ». Потому что я предан и все такое.)

Кроме того, в качестве дополнительного примечания, если предположить, что это относится к вашей модели Case, предложение "and case_maps.case_id = cases.id" не нужно, :joins => :case_map сделает это за вас.

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