假设我有一个带有2组复选框的单一网页表单用户界面。通过设置1复选框,我可以查看我想要的培训师(“杰森”,“亚历山德拉等”)通过设置2复选框,我可以查看我想看到的动物(“老虎”,“熊”,等一旦我提交了带有这些选项的表格,我会找回符合条件的动物园列表(让我们假设所有的动物园都在所有动物园工作,所有的动物都在动物园里供讨论)
我们将按“名称”运行我们的数据库查询(例如,使用培训师名称和动物名称进行搜索,而非数据库ID)
假设我们使用的Postgres数据库有数十万行(如果不是数百万行)。
Zoo.includes(:animals, :trainers).where("animals.name = ? and trainers.name = ?", animal_names, trainer_names)
?模型设置
class Zoo < ActiveRecord::Base
has_many :animals, through: zoo_animals
has_many :trainers, through: zoo_trainers
has_many :zoo_trainers
has_many :zoo_animals
end
class Animal < ActiveRecord::Base
has_many :zoos, through :zoo_animals
has_many :zoo_animals
end
class Trainer < ActiveRecord::Base
has_many :zoos, through :zoo_trainers
has_many :zoo_trainers
end
class ZooAnimal < ActiveRecord::Base
belongs_to :animal
belongs_to :zoo
end
class ZooTrainer < ActiveRecord::Base
belongs_to :zoo
belongs_to :trainer
end
编辑:假设我无法访问数据库ID。
答案 0 :(得分:1)
LIKE '%Jason%'
效率低于查询确切的字符串&#39; Jason&#39; (或查询ID),因为虽然LIKE
的精确比较和某些用法可以在要查询的列上使用索引LIKE
with a pattern beginning with a wildcard can't use an index。
然而,性能并不像这里最重要的考虑因素。在合理负载下,LIKE %Jason%
在合理大小的数据库上仍然可能足够快。如果应用程序确实需要通过子字符串搜索事物(这意味着搜索可能有多个结果),那么这个要求就不能通过简单的相等来满足。
搜索文本的解决方案数量不断增加,包括Postgres内置全文搜索和Elasticsearch等外部解决方案。如果没有具体的扩展要求,我会选择LIKE
,直到它开始变慢,然后才会投入更复杂的事情。