schema.rb
是数据库的Ruby表示形式,通常与数据库无关。 structure.sql
是数据库的SQL表示形式,它取决于您选择的特定数据库。因此,优选使用schema.rb
。
我正在使用Rails 4和PostgreSQL 9.6。在Mac OSX上,我使用Postgres.app(不要使用EnterpriseDB或自制程序!),因此我安装了postgis
扩展名。实际上,我遵循了this教程。
由于我使用的是Rails 4,因此我可以使用迁移添加扩展名:
class EnablePostgis < ActiveRecord::Migration[5.0]
def change
enable_extension :postgis
end
end
本教程陈述如下:
由于我们将使用一些原始SQL,我们需要从a切换 schema.rb到structure.sql。这意味着在开发中,我们是 要在原始SQL中保存我们的数据库快照,而不是Rails的Ruby 表示。
他在他的模型中创建了以下范围:
scope :close_to, -> (latitude, longitude, distance_in_meters = 2000) {
where(%{
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || cafes.longitude || ' ' || cafes.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(%f %f)'),
%d
)
} % [longitude, latitude, distance_in_meters])
}
此查询使用where ActiveRecord帮助程序,因此使用schema.rb显示它根本不会影响此查询。
他还使用PostgreSQL对表达式进行索引的能力,特别是对从咖啡馆的经度和纬度构建的点进行索引(在他的例子中)。
我真的需要为这个基于查询的索引使用structure.sql吗?我宁愿使用schema.rb。我可以使用schema.rb并仍然使用基于查询的索引,即使像mysql这样的某些数据库不支持它吗?