модуль ActiveRecord::QueryMethods
Константы
- FROZEN_EMPTY_ARRAY
- FROZEN_EMPTY_HASH
- VALID_UNSCOPING_VALUES
Открытые методы экземпляров
# File activerecord/lib/active_record/relation/query_methods.rb, line 681
def and(other)
if other.is_a?(Relation)
spawn.and!(other)
else
raise ArgumentError, "You have passed #{other.class.name} object to #and. Pass an ActiveRecord::Relation object instead."
end
end Возвращает новое отношение, которое является логическим пересечением этого отношения и отношения, переданного в качестве аргумента.
Два отношения должны быть структурно совместимыми: они должны охватывать одну и ту же модель и должны отличаться только where (если не определен group) или having (если присутствует group).
Post.where(id: [1, 2]).and(Post.where(id: [2, 3])) # SELECT `posts`.* FROM `posts` WHERE `posts`.`id` IN (1, 2) AND `posts`.`id` IN (2, 3)
# File activerecord/lib/active_record/relation/query_methods.rb, line 1038 def annotate(*args) check_if_method_has_arguments!(:annotate, args) spawn.annotate!(*args) end
Добавляет SQL комментарий к запросам, сгенерированным из этого отношения. Например:
User.annotate("selecting user names").select(:name)
# SELECT "users"."name" FROM "users" /* selecting user names */
User.annotate("selecting", "user", "names").select(:name)
# SELECT "users"."name" FROM "users" /* selecting */ /* user */ /* names */
Разделители SQL блочных комментариев, «/*» и «*/», будут добавлены автоматически.
# File activerecord/lib/active_record/relation/query_methods.rb, line 874 def create_with(value) spawn.create_with!(value) end
Устанавливает атрибуты, которые будут использоваться при создании новых записей из объекта отношения.
users = User.where(name: 'Oscar') users.new.name # => 'Oscar' users = users.create_with(name: 'DHH') users.new.name # => 'DHH'
Вы можете передать nil в create_with для сброса атрибутов:
users = users.create_with(nil) users.new.name # => 'Oscar'
# File activerecord/lib/active_record/relation/query_methods.rb, line 921 def distinct(value = true) spawn.distinct!(value) end
Определяет, должны ли записи быть уникальными или нет. Например:
User.select(:name) # Might return two records with the same name User.select(:name).distinct # Returns 1 record per distinct name User.select(:name).distinct.distinct(false) # You can also remove the uniqueness
# File activerecord/lib/active_record/relation/query_methods.rb, line 166 def eager_load(*args) check_if_method_has_arguments!(:eager_load, args) spawn.eager_load!(*args) end
Принудительно выполняет левое внешнее соединение с args.
User.eager_load(:posts) # SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, ... # FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = # "users"."id"
# File activerecord/lib/active_record/relation/query_methods.rb, line 967
def extending(*modules, &block)
if modules.any? || block
spawn.extending!(*modules, &block)
else
self
end
end Используется для расширения области видимости дополнительными методами, либо через модуль, либо через предоставленный блок.
Возвращаемый объект — это отношение, которое можно дополнительно расширить.
Использование модуля
module Pagination
def page(number)
# pagination code goes here
end
end
scope = Model.all.extending(Pagination)
scope.page(params[:page])
Вы также можете передать список модулей:
scope = Model.all.extending(Pagination, SomethingElse)
Использование блока
scope = Model.all.extending do
def page(number)
# pagination code goes here
end
end
scope.page(params[:page])
Вы также можете использовать блок и список модулей:
scope = Model.all.extending(Pagination) do
def per_page(number)
# pagination code goes here
end
end
# File activerecord/lib/active_record/relation/query_methods.rb, line 199 def extract_associated(association) preload(association).collect(&association) end
Извлекает указанную association из отношения. Указанная ассоциация сначала предварительно загружается, а затем отдельные записи ассоциации собираются из отношения. Вот так:
account.memberships.extract_associated(:user) # => Returns collection of User records
Это сокращенная запись для:
account.memberships.preload(:user).collect(&:user)
# File activerecord/lib/active_record/relation/query_methods.rb, line 902 def from(value, subquery_name = nil) spawn.from!(value, subquery_name) end
Определяет таблицу, из которой будут извлекаться записи. Например:
Topic.select('title').from('posts')
# SELECT title FROM posts
Может принимать и другие объекты отношений. Например:
Topic.select('title').from(Topic.approved)
# SELECT title FROM (SELECT * FROM topics WHERE approved = 't') subquery
Topic.select('a.title').from(Topic.approved, :a)
# SELECT a.title FROM (SELECT * FROM topics WHERE approved = 't') a
# File activerecord/lib/active_record/relation/query_methods.rb, line 322 def group(*args) check_if_method_has_arguments!(:group, args) spawn.group!(*args) end
Позволяет указать атрибут группировки:
User.group(:name) # SELECT "users".* FROM "users" GROUP BY name
Возвращает массив с уникальными записями на основе атрибута group.
User.select([:id, :name])
# => [#<User id: 1, name: "Oscar">, #<User id: 2, name: "Oscar">, #<User id: 3, name: "Foo">]
User.group(:name)
# => [#<User id: 3, name: "Foo", ...>, #<User id: 2, name: "Oscar", ...>]
User.group('name AS grouped_name, age')
# => [#<User id: 3, name: "Foo", age: 21, ...>, #<User id: 2, name: "Oscar", age: 21, ...>, #<User id: 5, name: "Foo", age: 23, ...>]
Поддерживается также передача массива атрибутов для группировки.
User.select([:id, :first_name]).group(:id, :first_name).first(3) # => [#<User id: 1, first_name: "Bill">, #<User id: 2, first_name: "Earl">, #<User id: 3, first_name: "Beto">]
# File activerecord/lib/active_record/relation/query_methods.rb, line 739 def having(opts, *rest) opts.blank? ? self : spawn.having!(opts, *rest) end
Позволяет указать предложение HAVING. Обратите внимание, что HAVING нельзя использовать без указания предложения GROUP.
Order.having('SUM(price) > 30').group('user_id')
# File activerecord/lib/active_record/relation/query_methods.rb, line 150 def includes(*args) check_if_method_has_arguments!(:includes, args) spawn.includes!(*args) end
Указывает отношения, которые должны быть включены в результирующий набор. Например:
users = User.includes(:address) users.each do |user| user.address.city end
позволяет получить доступ к атрибуту address модели User без запуска дополнительного запроса. Это часто приводит к повышению производительности по сравнению с простым соединением.
Вы также можете указать несколько отношений, как это:
users = User.includes(:address, :friends)
Загрузка вложенных отношений возможна с помощью хэша:
users = User.includes(:address, friends: [:address, :followers])
Условиям
Если вы хотите добавить строковые условия к включенным моделям, вам необходимо явно их указать. Например:
User.includes(:posts).where('posts.name = ?', 'example')
Вызовет ошибку, но это сработает:
User.includes(:posts).where('posts.name = ?', 'example').references(:posts)
Обратите внимание, что includes работает с именами ассоциаций, а references требует фактического имени таблицы.
Если вы передаёте условия через хэш, вам не нужно явно вызывать references, так как where обращается к таблицам за вас. Например, это сработает правильно:
User.includes(:posts).where(posts: { name: 'example' })
# File activerecord/lib/active_record/relation/query_methods.rb, line 489 def joins(*args) check_if_method_has_arguments!(:joins, args) spawn.joins!(*args) end
Выполняет соединения с args. Переданные символы должны соответствовать именам ассоциаций.
User.joins(:posts) # SELECT "users".* # FROM "users" # INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
Несколько соединений:
User.joins(:posts, :account) # SELECT "users".* # FROM "users" # INNER JOIN "posts" ON "posts"."user_id" = "users"."id" # INNER JOIN "accounts" ON "accounts"."id" = "users"."account_id"
Вложенные соединения:
User.joins(posts: [:comments]) # SELECT "users".* # FROM "users" # INNER JOIN "posts" ON "posts"."user_id" = "users"."id" # INNER JOIN "comments" ON "comments"."post_id" = "posts"."id"
Вы можете использовать строки для настройки соединений:
User.joins("LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id")
# SELECT "users".* FROM "users" LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id
# File activerecord/lib/active_record/relation/query_methods.rb, line 504 def left_outer_joins(*args) check_if_method_has_arguments!(__callee__, args) spawn.left_outer_joins!(*args) end
Выполняет левые внешние соединения с args.
User.left_outer_joins(:posts) => SELECT "users".* FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"
# File activerecord/lib/active_record/relation/query_methods.rb, line 753 def limit(value) spawn.limit!(value) end
Устанавливает ограничение на количество извлекаемых записей.
User.limit(10) # generated SQL has 'LIMIT 10' User.limit(10).limit(20) # generated SQL has 'LIMIT 20'
# File activerecord/lib/active_record/relation/query_methods.rb, line 780 def lock(locks = true) spawn.lock!(locks) end
Устанавливает параметры блокировки (по умолчанию true). Дополнительную информацию о блокировке см. в ActiveRecord::Locking.
# File activerecord/lib/active_record/relation/query_methods.rb, line 823 def none spawn.none! end
Возвращает цепочечное отношение без записей.
Возвращаемое отношение реализует шаблон «Null» Object. Это объект с определенным поведением при нулевом значении и всегда возвращает пустой массив записей без обращения к базе данных.
Любое последующее условие, присоединенное к возвращаемому отношению, будет продолжать генерировать пустое отношение и не будет выполнять ни одного запроса к базе данных.
Используется в тех случаях, когда метод или область видимости могут вернуть ноль записей, но результат должен быть цепочечным.
Например:
@posts = current_user.visible_posts.where(name: params[:name])
# the visible_posts method is expected to return a chainable Relation
def visible_posts
case role
when 'Country Manager'
Post.where(country: country)
when 'Reviewer'
Post.published
when 'Bad User'
Post.none # It can't be chained if [] is returned.
end
end
# File activerecord/lib/active_record/relation/query_methods.rb, line 769 def offset(value) spawn.offset!(value) end
Указывает количество строк, которые нужно пропустить перед возвратом строк.
User.offset(10) # generated SQL has "OFFSET 10"
Должно использоваться с order.
User.offset(10).order("name ASC")
# File activerecord/lib/active_record/relation/query_methods.rb, line 996 def optimizer_hints(*args) check_if_method_has_arguments!(:optimizer_hints, args) spawn.optimizer_hints!(*args) end
Укажите подсказки оптимизатору, которые будут использоваться в операторе SELECT.
Пример (для MySQL):
Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
# SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
Пример (для PostgreSQL с pg_hint_plan):
Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
# SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
# File activerecord/lib/active_record/relation/query_methods.rb, line 713
def or(other)
if other.is_a?(Relation)
spawn.or!(other)
else
raise ArgumentError, "You have passed #{other.class.name} object to #or. Pass an ActiveRecord::Relation object instead."
end
end Возвращает новую отношение, которая является логическим объединением этой отношения и отношения, переданного в качестве аргумента.
Две отношения должны быть структурно совместимы: они должны охватывать одну и ту же модель, и они должны отличаться только where (если не определен group) или having (если определен group).
Post.where("id = 1").or(Post.where("author_id = 3"))
# SELECT `posts`.* FROM `posts` WHERE ((id = 1) OR (author_id = 3))
# File activerecord/lib/active_record/relation/query_methods.rb, line 351
def order(*args)
check_if_method_has_arguments!(:order, args) do
sanitize_order_arguments(args)
end
spawn.order!(*args)
end Позволяет указать атрибут сортировки:
User.order(:name)
# SELECT "users".* FROM "users" ORDER BY "users"."name" ASC
User.order(email: :desc)
# SELECT "users".* FROM "users" ORDER BY "users"."email" DESC
User.order(:name, email: :desc)
# SELECT "users".* FROM "users" ORDER BY "users"."name" ASC, "users"."email" DESC
User.order('name')
# SELECT "users".* FROM "users" ORDER BY name
User.order('name DESC')
# SELECT "users".* FROM "users" ORDER BY name DESC
User.order('name DESC, email')
# SELECT "users".* FROM "users" ORDER BY name DESC, email
# File activerecord/lib/active_record/relation/query_methods.rb, line 180 def preload(*args) check_if_method_has_arguments!(:preload, args) spawn.preload!(*args) end
Позволяет предварительно загрузить args, аналогично тому, как это делает includes:
User.preload(:posts) # SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1, 2, 3)
# File activerecord/lib/active_record/relation/query_methods.rb, line 837 def readonly(value = true) spawn.readonly!(value) end
Устанавливает атрибуты только для чтения для возвращаемой отношения. Если значение true (по умолчанию), попытка обновления записи приведет к ошибке.
users = User.readonly users.first.save => ActiveRecord::ReadOnlyRecord: User is marked as readonly
# File activerecord/lib/active_record/relation/query_methods.rb, line 213 def references(*table_names) check_if_method_has_arguments!(:references, table_names) spawn.references!(*table_names) end
Используется для указания, что заданные table_names ссылаются на строку SQL и должны быть объединены в запросе (JOIN), а не загружаться отдельно. Этот метод работает только совместно с includes. Смотрите includes для получения дополнительной информации.
User.includes(:posts).where("posts.name = 'foo'")
# Doesn't JOIN the posts table, resulting in an error.
User.includes(:posts).where("posts.name = 'foo'").references(:posts)
# Query now knows the string references posts, so adds a JOIN
# File activerecord/lib/active_record/relation/query_methods.rb, line 374
def reorder(*args)
check_if_method_has_arguments!(:reorder, args) do
sanitize_order_arguments(args) unless args.all?(&:blank?)
end
spawn.reorder!(*args)
end Заменяет любое существующее упорядочение в отношении заданным порядком.
User.order('email DESC').reorder('id ASC') # generated SQL has 'ORDER BY id ASC'
Последующие вызовы order для той же отношения будут добавлены. Например:
User.order('email DESC').reorder('id ASC').order('name ASC')
генерирует запрос с 'ORDER BY id ASC, name ASC'.
# File activerecord/lib/active_record/relation/query_methods.rb, line 291 def reselect(*args) check_if_method_has_arguments!(:reselect, args) spawn.reselect!(*args) end
Позволяет изменить ранее заданный оператор select.
Post.select(:title, :body) # SELECT `posts`.`title`, `posts`.`body` FROM `posts` Post.select(:title, :body).reselect(:created_at) # SELECT `posts`.`created_at` FROM `posts`
Это сокращение для unscope(:select).select(fields). Обратите внимание, что мы снимаем ограничение со всего оператора select.
# File activerecord/lib/active_record/relation/query_methods.rb, line 1009 def reverse_order spawn.reverse_order! end
Изменяет порядок существующей части запроса order.
User.order('name ASC').reverse_order # generated SQL has 'ORDER BY name DESC'
# File activerecord/lib/active_record/relation/query_methods.rb, line 662 def rewhere(conditions) scope = spawn where_clause = scope.build_where_clause(conditions) scope.unscope!(where: where_clause.extract_attributes) scope.where_clause += where_clause scope end
Позволяет изменить ранее заданное условие where для данного атрибута, вместо добавления к этому условию.
Post.where(trashed: true).where(trashed: false) # WHERE `trashed` = 1 AND `trashed` = 0 Post.where(trashed: true).rewhere(trashed: false) # WHERE `trashed` = 0 Post.where(active: true).where(trashed: true).rewhere(trashed: false) # WHERE `active` = 1 AND `trashed` = 0
Это сокращение для unscope(where: conditions.keys).where(conditions). Обратите внимание, что в отличие от reorder, мы снимаем ограничение только с указанных условий, а не со всего оператора where.
# File activerecord/lib/active_record/relation/query_methods.rb, line 263
def select(*fields)
if block_given?
if fields.any?
raise ArgumentError, "`select' with block doesn't take arguments."
end
return super()
end
check_if_method_has_arguments!(:select, fields, "Call `select' with at least one field.")
spawn._select!(*fields)
end Работает двумя способами.
Во-первых: принимает блок, поэтому может использоваться как Array#select.
Model.all.select { |m| m.field == value }
Это создаст массив объектов из базы данных для области видимости, преобразует их в массив и итерируется по ним с помощью Array#select.
Во-вторых: изменяет оператор SELECT для запроса так, чтобы возвращались только определённые поля:
Model.select(:field) # => [#<Model id: nil, field: "value">]
Хотя в примере кажется, что этот метод возвращает массив, он фактически возвращает объект отношения и к нему можно добавить другие методы запроса, такие как другие методы в ActiveRecord::QueryMethods.
Аргументом метода также может быть массив полей.
Model.select(:field, :other_field, :and_one_more) # => [#<Model id: nil, field: "value", other_field: "value", and_one_more: "value">]
Вы также можете использовать одну или несколько строк, которые будут использоваться как поля SELECT без изменений.
Model.select('field AS field_one', 'other_field AS field_two')
# => [#<Model id: nil, field: "value", other_field: "value">]
Если был указан псевдоним, он будет доступен из результирующих объектов:
Model.select('field AS field_one').first.field_one
# => "value"
Доступ к атрибутам объекта, которые не имеют полей, полученных методом select, кроме id приведет к ActiveModel::MissingAttributeError:
Model.select(:field).first.other_field # => ActiveModel::MissingAttributeError: missing attribute: other_field
# File activerecord/lib/active_record/relation/query_methods.rb, line 852 def strict_loading(value = true) spawn.strict_loading!(value) end
Устанавливает возвращаемую отношение в режим strict_loading. Это вызовет ошибку, если запись попытается загрузить ассоциацию лениво.
user = User.strict_loading.first user.comments.to_a => ActiveRecord::StrictLoadingViolationError
# File activerecord/lib/active_record/relation/query_methods.rb, line 1050
def uniq!(name)
if values = @values[name]
values.uniq! if values.is_a?(Array) && !values.empty?
end
self
end Уникализация нескольких значений.
# File activerecord/lib/active_record/relation/query_methods.rb, line 427 def unscope(*args) check_if_method_has_arguments!(:unscope, args) spawn.unscope!(*args) end
Удаляет нежелательные отношения, которые уже определены в цепочке отношений. Это полезно при передаче цепочек отношений и желании изменить отношения без перестроения всей цепочки.
User.order('email DESC').unscope(:order) == User.all
Аргументы метода — символы, соответствующие именам методов, которые следует снять с отслеживания. Допустимые аргументы указаны в VALID_UNSCOPING_VALUES. Метод также может быть вызван с несколькими аргументами. Например:
User.order('email DESC').select('id').where(name: "John")
.unscope(:order, :select, :where) == User.all
Кроме того, можно передать хэш в качестве аргумента, чтобы снять отслеживания определённых значений :where. Это делается путём передачи хэша с единственной парой ключ-значение. Ключ должен быть :where, а значение — значением where для снятия с отслеживания. Например:
User.where(name: "John", active: true).unscope(where: :name)
== User.where(active: true) Этот метод похож на except, но в отличие от except, он сохраняется при слиянии:
User.order('email').merge(User.except(:order))
== User.order('email')
User.order('email').merge(User.unscope(:order))
== User.all Это значит, что он может использоваться в определениях ассоциаций:
has_many :comments, -> { unscope(where: :trashed) }
# File activerecord/lib/active_record/relation/query_methods.rb, line 634
def where(*args)
if args.empty?
WhereChain.new(spawn)
elsif args.length == 1 && args.first.blank?
self
else
spawn.where!(*args)
end
end Возвращает новое отношение, которое является результатом фильтрации текущего отношения в соответствии с условиями в аргументах.
where принимает условия в одном из нескольких форматов. В примерах ниже показан результирующий SQL; фактический сгенерированный запрос может отличаться в зависимости от адаптера базы данных.
строка
Одна строка без дополнительных аргументов передается конструктору запроса в качестве фрагмента SQL и используется в условии where запроса.
Client.where("orders_count = '2'")
# SELECT * from clients where orders_count = '2';
Обратите внимание, что создание собственной строки из пользовательского ввода может подвергнуть вашу программу атакам с инъекциями, если это не сделано надлежащим образом. В качестве альтернативы рекомендуется использовать один из следующих методов.
массив
Если передается массив, то первый элемент массива обрабатывается как шаблон, а остальные элементы вставляются в шаблон для генерации условия. Active Record позаботится о построении запроса, чтобы избежать атак с инъекциями, и преобразует тип Ruby в тип базы данных при необходимости. Элементы вставляются в строку в том порядке, в котором они появляются.
User.where(["name = ? and email = ?", "Joe", "joe@example.com"]) # SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
В качестве альтернативы можно использовать именованные плейсхолдеры в шаблоне и передать хеш как второй элемент массива. Имена в шаблоне заменяются соответствующими значениями из хеша.
User.where(["name = :name and email = :email", { name: "Joe", email: "joe@example.com" }])
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
Это может сделать код более читабельным в сложных запросах.
Наконец, можно использовать экранирование % в стиле sprintf в шаблоне. Это работает немного иначе, чем предыдущие методы; вы несете ответственность за обеспечение того, что значения в шаблоне правильно заключены в кавычки. Значения передаются соединителю для цитирования, но вызов должен гарантировать, что они заключены в кавычки в результирующем SQL. После цитирования значения вставляются с использованием тех же экранирований, что и метод ядра Ruby Kernel::sprintf.
User.where(["name = '%s' and email = '%s'", "Joe", "joe@example.com"]) # SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
Если where вызывается с несколькими аргументами, они обрабатываются так, как будто они переданы как элементы одного массива.
User.where("name = :name and email = :email", { name: "Joe", email: "joe@example.com" })
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
При использовании строк для указания условий вы можете использовать любой оператор, доступный из базы данных. Хотя это обеспечивает максимальную гибкость, вы также можете непреднамеренно ввести зависимость от базовой базы данных. Если ваш код предназначен для общего использования, протестируйте его с несколькими базами данных.
хеш
where также принимает условие в виде хеша, в котором ключи — это поля, а значения — значения, которые нужно найти.
Поля могут быть символами или строками. Значения могут быть одиночными значениями, массивами или диапазонами.
User.where({ name: "Joe", email: "joe@example.com" })
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com'
User.where({ name: ["Alice", "Bob"]})
# SELECT * FROM users WHERE name IN ('Alice', 'Bob')
User.where({ created_at: (Time.now.midnight - 1.day)..Time.now.midnight })
# SELECT * FROM users WHERE (created_at BETWEEN '2012-06-09 07:00:00.000000' AND '2012-06-10 07:00:00.000000')
В случае связи belongs_to можно использовать ключ ассоциации для указания модели, если в качестве значения используется объект ActiveRecord.
author = Author.find(1) # The following queries will be equivalent: Post.where(author: author) Post.where(author_id: author)
Это также работает с полиморфными связями belongs_to:
treasure = Treasure.create(name: 'gold coins') treasure.price_estimates << PriceEstimate.create(price: 125) # The following queries will be equivalent: PriceEstimate.where(estimate_of: treasure) PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: treasure)
Соединения
Если отношение является результатом соединения, вы можете создать условие, которое использует любую из таблиц в соединении. Для строчных и массивов используйте имя таблицы в условии.
User.joins(:posts).where("posts.created_at < ?", Time.now)
Для условий в виде хеша вы можете использовать имя таблицы в ключе или использовать подхеш.
User.joins(:posts).where({ "posts.published" => true })
User.joins(:posts).where({ posts: { published: true } })
без аргумента
Если аргумент не передан, where возвращает новый экземпляр WhereChain, который можно использовать с не, чтобы вернуть новое отношение, которое отрицает условие where.
User.where.not(name: "Jon") # SELECT * FROM users WHERE name != 'Jon'
См. WhereChain для получения более подробной информации о not.
пустое условие
Если условие — это любое пустое значение, то where — это операция без действия и возвращает текущее отношение.
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.