Class: ZeroRailsAdapter::PostgreSQL::PublicationGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/zero_rails_adapter/postgresql/publication_generator.rb

Constant Summary collapse

DEFAULT_NAME =
"zero_data"

Instance Method Summary collapse

Constructor Details

#initialize(name: DEFAULT_NAME, published_schema: nil) ⇒ PublicationGenerator

Returns a new instance of PublicationGenerator.



8
9
10
11
12
13
14
# File 'lib/zero_rails_adapter/postgresql/publication_generator.rb', line 8

def initialize(name: DEFAULT_NAME, published_schema: nil)
  @name = name.to_s
  @published_schema = PublishedSchema.new(
    published_schema || ZeroRailsAdapter.configuration.published_schema.call,
    zero_key: ZeroRailsAdapter.configuration.zero_key
  )
end

Instance Method Details

#sqlObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/zero_rails_adapter/postgresql/publication_generator.rb', line 16

def sql
  entries = @published_schema.models.map do |model|
    connection = model.connection
    quoted_columns = @published_schema.column_names_for(model).map do |column|
      connection.quote_column_name(column)
    end

    "#{connection.quote_table_name(model.table_name)} (#{quoted_columns.join(', ')})"
  end

  raise UnsafePublicationError, "Published schema must include at least one table" if entries.empty?

  connection = @published_schema.models.first.connection
  <<~SQL
    CREATE PUBLICATION #{connection.quote_column_name(@name)} FOR TABLE
      #{entries.join(",\n  ")};
  SQL
end