Во-первых, я хотел бы объяснить способ 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
в свое приложение.
спасибо, но я уже понял это (см. Часть «обновления» моего вопроса) - +1 за усилие. Я согласен с вами в том, что это может быть законченный; еще одна гипотеза заключается в том, что это средство предназначено для конкретных адаптеров, которые в этом нуждаются. Что касается блуждания в источнике адаптера postgres, я не видел, чтобы он действительно использовал значения. Я пробовал некоторые вещи типа Model.where ("field =?") .Bind (value) .to_sql', но значения привязки не отображаются в запросе. Поэтому я предполагаю, что он может использоваться некоторыми адаптерами, которые будут строить подготовленные (предварительно скомпилированные) операторы? –
Я бы не сказал, что это полный ответ, но вы единственный, кто пытался, поэтому щедрость для вас. спасибо в любом случае –
Спасибо! Извините, я больше не мог понять. Я мог бы спросить устроителей Rails. –