简体   繁体   中英

Ruby on Rails : how to generate an application-wide sequence?

I am developing on RoR 4, with Oracle, PostGreSQL and MSSQL as target databases.

I am building a hierarchy of 4 objects, for which I need to display parent-child relationships through the same query whatever level I start from. Not easy to figure out, but the hint is that none of the object should have identical IDs .

The issue here is that rails maintains a dedicated sequence for each object, so duplicated IDs will appear for sure.

How can I create a sequence to fill a unique_id field which remains unique for all my data ?

Thanks for your help,

Best regards,

Fred

I finally found this solution:

1 - create a sequence to be used by each of concerned objects

class CreateGlobalSequence < ActiveRecord::Migration
  def change
    execute "CREATE SEQUENCE global_seq INCREMENT BY 1 START WITH 1000"
  end
end

2 - Declare this sequence to be used for identity columns in each of concerned models

class BusinessProcess < ActiveRecord::Base

self.sequence_name = "global_seq"
...
end


class BusinessRule < ActiveRecord::Base

self.sequence_name = "global_seq"
...
end

and so on. It works fine.

Rails is great !

Thanks for your help, and best regards,

Fred

Id column for each table is unique identifier for each table record. It will not make any impact on other table Id column.

Don't know why you need this. But you can achieve it by some extent. Like below :

class CreateSimpleModels < ActiveRecord::Migration
  def self.up
    create_table :simple_models do |t|
      t.string :xyz
      t.integer :unique_id
      t.timestamps
    end
    execute "CREATE SEQUENCE simple_models_unique_id_seq OWNED BY
simple_models.unique_id INCREMENT BY 1 START WITH 100000"
  end

  def self.down
    drop_table :simple_models
    execute "DELETE SEQUENCE simple_models_unique_id_seq"
  end
end

But after 100000 record in db it will again going to similar for other model.

The default id column has the identity attribute, which is stored per-table. If your models fit the bill for Single Table Inheritance you'd be able to define a custom id attribute on the base class. In your case since you said it's a hierarchy that might be the way to go.

The harder? (STI is a bit to digest but very powerful) way of doing this involves what I'm working on this similar issue with a shared PAN (Private Account Number in this system) in a shared namespace.

class CreatePans < ActiveRecord::Migration
  def change
    create_table :pans do |t|
      t.string :PAN
      t.timestamps
    end
  end
end

class AddPanIdToCustomers < ActiveRecord::Migration
  def change
    add_column :customers, :pan_id, :integer
  end
end

The first migration will add the ID table, the second adds the foreign key to the customers table. You'll also need to add the relationships to the models has_many :pans and belongs_to :customers . You can then refer to their identity by the :pan_id attribute (however you name it). It's a roundabout way of doing things, but in my case business requirements force it - hacky as it is.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM