Ruby on rails 对于基于postgresql索引的查询和postgis,我仍然可以使用schema.rb而不是structure.sql吗?

Ruby on rails 对于基于postgresql索引的查询和postgis,我仍然可以使用schema.rb而不是structure.sql吗?,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,schema.rb是数据库的一种Ruby表示,它通常与数据库无关结构。sql是数据库的sql表示形式,它取决于您选择的特定数据库。因此,最好使用schema.rb 我正在使用Rails 4和PostgreSQL 9.6。在Mac OSX上,我使用Postgres.app(不要使用EnterpriseDB或homebrew!),因此我安装了postgisextension。事实上,我遵循了教程 因为我使用的是Rails 4,所以我能够通过迁移添加扩展: class EnablePostgis &l

schema.rb
是数据库的一种Ruby表示,它通常与数据库无关<代码>结构。sql是数据库的sql表示形式,它取决于您选择的特定数据库。因此,最好使用
schema.rb

我正在使用Rails 4和PostgreSQL 9.6。在Mac OSX上,我使用Postgres.app(不要使用EnterpriseDB或homebrew!),因此我安装了
postgis
extension。事实上,我遵循了教程

因为我使用的是Rails 4,所以我能够通过迁移添加扩展:

class EnablePostgis < ActiveRecord::Migration[5.0]
  def change
    enable_extension :postgis
  end
end
此查询使用where ActiveRecord帮助程序,因此它使用schema.rb显示不会影响此查询

他还使用PostgreSQL对表达式进行索引的能力,特别是对根据cafe的经度和纬度构建的点进行索引(在他的示例中)


对于这个基于查询的索引,我真的需要使用structure.sql吗?我宁愿使用schema.rb。我可以不使用schema.rb而仍然使用基于查询的索引吗,即使有些数据库(如mysql)不支持它?

可以,您可以创建使用原始sql的迁移
schema.rb
只是数据库状态的快照,rails实际上没有使用它。无论你遵循什么教程,都是大错特错的。使用structure.sql并直接操作不是一个好主意,因为它将被将来的迁移所覆盖。@max那么,为什么这篇文章要我使用structure.sql?因为作者不太清楚?你知道他们说什么——那些做不到的人——教书。@max你确定吗?ActiveRecord是否必须了解所有PostGIS功能和类型?请记住,
schema.rb
只是ActiveRecord对数据库结构的理解,而
structure.sql
是数据库对自身结构的理解;如果您使用AR不了解的任何内容(例如AR不了解的列类型、检查约束、触发器、表定义中的函数等),则必须使用
structure.sql
,否则会丢失信息。您可以在函数结果或部分索引(即带有WHERE子句的索引)上创建索引使用
connection。在迁移中执行
,然后查看
schema.rb
所说的话,如果
schema.rb
没有在索引或WHERE子句中包含函数调用,则切换到
structure.sql
。是的,您可以创建使用原始sql的迁移
schema.rb
只是数据库状态的快照,rails实际上没有使用它。无论你遵循什么教程,都是大错特错的。使用structure.sql并直接操作不是一个好主意,因为它将被将来的迁移所覆盖。@max那么,为什么这篇文章要我使用structure.sql?因为作者不太清楚?你知道他们说什么——那些做不到的人——教书。@max你确定吗?ActiveRecord是否必须了解所有PostGIS功能和类型?请记住,
schema.rb
只是ActiveRecord对数据库结构的理解,而
structure.sql
是数据库对自身结构的理解;如果您使用AR不了解的任何内容(例如AR不了解的列类型、检查约束、触发器、表定义中的函数等),则必须使用
structure.sql
,否则会丢失信息。您可以在函数结果或部分索引(即带有WHERE子句的索引)上创建索引使用
connection。在迁移中执行
,然后查看
schema.rb
要说什么,如果
schema.rb
没有在索引或WHERE子句中包含函数调用,则切换到
structure.sql
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])
}