Rails 3 ActiveRecord bir OR sorgusu nasıl yapılır. Bulduğum tüm örneklerde VE sorguları var.
Düzenleme: OR yöntemi Rails 5'ten beri kullanılabilir. Bkz. ActiveRecord :: QueryMethods
Post.where(column: 'something').or(Post.where(other: 'else'))
Rails 3 ActiveRecord bir OR sorgusu nasıl yapılır. Bulduğum tüm örneklerde VE sorguları var.
Düzenleme: OR yöntemi Rails 5'ten beri kullanılabilir. Bkz. ActiveRecord :: QueryMethods
Post.where(column: 'something').or(Post.where(other: 'else'))
Yanıtlar:
ARel kullanın
t = Post.arel_table
results = Post.where(
t[:author].eq("Someone").
or(t[:title].matches("%something%"))
)
Ortaya çıkan SQL:
ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT "posts".* FROM "posts" WHERE (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))
matches
üretir . LIKE
ILIKE
Bir sütunun değerinde OR işleci kullanmak istiyorsanız, bir dizi iletebilirsiniz .where
ve ActiveRecord şunları kullanır IN(value,other_value)
:
Model.where(:column => ["value", "other_value"]
çıktılar:
SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')
Bu, OR
tek bir sütundaki a değerine eşdeğer olmalıdır
Rails 3'te,
Model.where("column = ? or other_column = ?", value, other_value)
Bu da ham sql içerir ama ActiveRecord VEYA işlemi yapmak için bir yol olduğunu sanmıyorum. Sorunuz bir noob sorusu değil.
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
Rails / ActiveRecord'un güncellenmiş bir sürümü bu sözdizimini yerel olarak destekleyebilir. Şuna benzer görünecektir:
Foo.where(foo: 'bar').or.where(bar: 'bar')
Bu çekme isteğinde belirtildiği gibi https://github.com/rails/rails/pull/9052
Şimdilik, sadece aşağıdakilere sadık kalmak harika çalışıyor:
Foo.where('foo= ? OR bar= ?', 'bar', 'bar')
Güncelleme: göre https://github.com/rails/rails/pull/16052or
özelliği Raylar satışa sunulacak 5
Güncelleme: Özellik Rails 5 şubesine birleştirildi
or
şu anda kullanılabilir Rails 5, ancak 1 argümanın iletilmesini beklediğinden bu şekilde uygulanamaz. Bir Arel nesnesi bekliyor. Kabul edilen yanıtı görün
or
ActiveRecord yöntem doğrudan kullandığınız eğer çalışır: ama daha sonra zincirlenmiş bir kapsamda kullanılır eğer beklentilerinizi kırabilir.
Rails kısa süre önce bunu ActiveRecord'a ekledi. Rails 5'de piyasaya sürülecek gibi görünüyor.
https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89
Post.where(column: 'something').or(Post.where(other: 'else'))
# => SELECT * FROM posts WHERE (column = 'something') OR (other = 'else)
Raylar 5 bir or
yöntemle gelir . (l dokümanlara mürekkep )
Bu yöntem bir ActiveRecord::Relation
nesneyi kabul eder . Örneğin:
User.where(first_name: 'James').or(User.where(last_name: 'Scott'))
Dizileri bağımsız değişken olarak kullanmak isterseniz, Rails 4'te aşağıdaki kod çalışır:
query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms) SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))
Daha fazla bilgi: VEYA Rails 4'te bağımsız değişken olarak dizileri sorgular .
Order.where(query.where_values.inject(:or))
arel'i sonuna kadar kullanmak.
MetaWhere eklentisi tamamen şaşırtıcı.
OR'leri ve AND'leri kolayca karıştırın, herhangi bir ilişkilendirmedeki koşullara katılın ve hatta OUTER JOIN'ları belirtin!
Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
Koşullara bir OR ekleyin
Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
Bu eklentiyi.or.
, eski, kapsamları birleştirmenize izin veren istemci çalışmasından çıkardım . Post.published.or.authored_by(current_user)
. Squeel (MetaSearch'ün daha yeni uygulanması) da harika, ancak OR kapsamlarını belirlemenize izin vermiyor, bu nedenle sorgu mantığı biraz gereksiz olabilir.
Raylar + arel ile daha net bir yol:
# Table name: messages
#
# sender_id: integer
# recipient_id: integer
# content: text
class Message < ActiveRecord::Base
scope :by_participant, ->(user_id) do
left = arel_table[:sender_id].eq(user_id)
right = arel_table[:recipient_id].eq(user_id)
where(Arel::Nodes::Or.new(left, right))
end
end
üretir:
$ Message.by_participant(User.first.id).to_sql
=> SELECT `messages`.*
FROM `messages`
WHERE `messages`.`sender_id` = 1
OR `messages`.`recipient_id` = 1
Bunu şöyle yapabilirsiniz:
Person.where("name = ? OR age = ?", 'Pearl', 24)
veya daha zarif, rails_or gem yükleyin ve şöyle yapın:
Person.where(:name => 'Pearl').or(:age => 24)
Bu bir ActiveRecord birden çok özniteliği aramak için bir çözüm eklemek istiyorum. Dan beri
.where(A: param[:A], B: param[:B])
A ve B'yi arayacaktır.
Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')