簡體   English   中英

Ruby on Rails:如何生成應用程序范圍的序列?

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

我正在開發RoR 4,Oracle,PostGreSQL和MSSQL作為目標數據庫。

我正在構建一個包含4個對象的層次結構,我需要通過相同的查詢顯示父子關系。 不容易弄清楚,但提示是沒有任何對象應該具有相同的ID

這里的問題是rails為每個對象維護一個專用序列,因此肯定會出現重復的ID。

如何創建一個序列來填充unique_id字段,該字段對於我的所有數據都是唯一的?

謝謝你的幫助,

最好的祝福,

弗雷德

我終於找到了這個解決方案

1 - 創建每個相關對象使用的序列

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

2 - 聲明此序列用於每個相關模型中的標識列

class BusinessProcess < ActiveRecord::Base

self.sequence_name = "global_seq"
...
end


class BusinessRule < ActiveRecord::Base

self.sequence_name = "global_seq"
...
end

等等。 它工作正常。

Rails太棒了!

感謝您的幫助和最誠摯的問候,

弗雷德

每個表的Id列是每個表記錄的唯一標識符。 它不會對其他表Id列產生任何影響。

不知道你為什么需要這個。 但是你可以在某種程度上實現它。 如下所示:

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

但是在db中100000記錄后,它將再次與其他型號相似。

默認id列具有identity屬性,該屬性存儲在每個表中。 如果您的模型符合單表繼承的帳單,您就可以在基類上定義自定義ID屬性。 在你的情況下,因為你說它是一個層次結構,可能是要走的路。

更難? (STI有點消化,但非常強大)這樣做的方式涉及我正在使用共享命名空間中的共享PAN(此系統中的專用帳號)處理此類似問題。

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

第一次遷移將添加ID表,第二次將外鍵添加到customers表。 您還需要將關系添加到模型has_many :pansbelongs_to :customers 然后,您可以通過:pan_id屬性引用它們的標識(但是您可以將其命名)。 這是一種迂回的做事方式,但就我而言,業務要求迫使它 - 實際上是hacky。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM