2013-02-19 3 views
6

Просто из любопытства - я читал документы о Relation::QueryMethods module и обнаружили, что метод:Какова цель ActiveRecord :: Связь # bind?

def bind(value) 
    relation = clone 
    relation.bind_values += [value] 
    relation 
end 

Кто-нибудь знает, что это такое? Я попытался найти сам, но потерпел неудачу.

UPDATE

Я разыскал использование @bind_values в бездонную глубину ActiveRecord::ConnectionAdapters - значения передаются дальше и дальше до низкоуровневых казней SQL заявления. Кажется, что отдельные адаптеры могут их использовать. Я предполагаю, что это связано с подготовленными заявлениями, такими как SELECT * FROM 'table' WHERE 'field' = ?, но я застрял здесь. Кто угодно?

ответ

9

Во-первых, я хотел бы объяснить способ find_by_sql, предоставляемый ActiveRecord. Похоже, что этот метод может использоваться как это:

Post.find_by_sql("SELECT title FROM posts WHERE author_id = ?", [author_id]) 

Второй параметр называется «связывает» и это массив переменных, которые соответствуют вопросительным знакам в запросе. Вы действительно хотите использовать массив привязывает для вставки параметров в запрос, потому что он избегает много SQL injection опасностей, которые случаются, если вы сделали привязку себя:

Post.find_by_sql("SELECT title FROM posts WHERE author_id = #{author_id}") 

Итак, как же это относится к ActiveRecord :: Связь? Точка AREL заключается в том, что вы можете создать запрос немного за раз, вызвав методы в объекте ActiveRecord :: Relation. Есть куча этих методов, а вот некоторые списки них:

http://apidock.com/rails/v3.2.8/ActiveRecord/QueryMethods

Так метод bind создает новый объект клонирования текущую, добавляет указанный value к списку bind_values, и затем возвращает новый объект. В конце концов, когда отношение используется для генерации запроса, это значение будет использоваться для создания запроса. Один example где bind_values получить передается find_by_sql в методе exec_queries:

@records = eager_loading? ? find_with_associations : @klass.find_by_sql(arel, bind_values) 

Вы можете искать «bind_values» в activerecord драгоценный камень, и вы найдете несколько подобных мест, где он используется.

Я бы подумал, что метод bind будет называться where, но он, похоже, не называется нигде в activerecord. Может быть, это более старый дизайн. Я не думаю, что вы должны позвонить bind в свое приложение.

+0

спасибо, но я уже понял это (см. Часть «обновления» моего вопроса) - +1 за усилие. Я согласен с вами в том, что это может быть законченный; еще одна гипотеза заключается в том, что это средство предназначено для конкретных адаптеров, которые в этом нуждаются. Что касается блуждания в источнике адаптера postgres, я не видел, чтобы он действительно использовал значения. Я пробовал некоторые вещи типа Model.where ("field =?") .Bind (value) .to_sql', но значения привязки не отображаются в запросе. Поэтому я предполагаю, что он может использоваться некоторыми адаптерами, которые будут строить подготовленные (предварительно скомпилированные) операторы? –

+0

Я бы не сказал, что это полный ответ, но вы единственный, кто пытался, поэтому щедрость для вас. спасибо в любом случае –

+0

Спасибо! Извините, я больше не мог понять. Я мог бы спросить устроителей Rails. –

Смежные вопросы