Rails Newbie: добавляются условия в activerecord? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть форма, которая используется для фильтрации запросов.Некоторые из атрибутов формы являются необязательными;Мне просто интересно, как добавить их в качестве условий activerecord, если (и только если) они имеют заданное значение?

Их довольно много, поэтому я бы не стал делать отдельный запрос для каждого шаблонапотенциальных значений.Любые предложения?

Чтобы привести конкретный пример:

people = People.paginate(
  :all,
  :include => [:people_postcodes, :people_specialties, :people_states],
  :conditions => ["people_specialties.people_type_id = %s AND (people_postcodes.postcode_id = %s OR people_states.state_id = %s)" % [self.people_type_id, postcodeid.id, stateid]], 
  :page => page, 
  :per_page => 16
)

Как мне лучше всего создать дополнительное условие (скажем, «национальность»), только если заполнен необязательный атрибут «национальность»

1 Ответ

2 голосов
/ 03 декабря 2010

Во-первых, ваши условия немного небезопасны. Вы делаете простую подстановку текста в рубине, которая позволит пользователям сайта вводить любой вредоносный sql, который они хотят. Вместо этого отформатируйте его так:

people = People.paginate(
  :all,
  :include => [:people_postcodes, :people_specialties, :people_states],
  :conditions => ["people_specialties.people_type_id = ? AND (people_postcodes.postcode_id = ? OR people_states.state_id = ?)", self.people_type_id, postcodeid.id, stateid], 
  :page => page, 
  :per_page => 16
)

Чтобы ответить на ваш вопрос, в Rails 2.x нет естественного способа использовать другое условие. Я бы сделал это:

conditions = ["people_specialties.people_type_id = ? AND (people_postcodes.postcode_id = ? OR people_states.state_id = ?)", self.people_type_id, postcodeid.id, stateid]

if params[:nationality]
  conditions.first += " and nationality = ?"
  conditions.push params[:nationality]
end

people = People.paginate(
  :all,
  :include => [:people_postcodes, :people_specialties, :people_states],
  :conditions => conditions, 
  :page => page, 
  :per_page => 16
)

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

Надеюсь, это поможет!

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