[英]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 :pans
和belongs_to :customers
。 然后,您可以通過:pan_id
屬性引用它們的標識(但是您可以將其命名)。 這是一種迂回的做事方式,但就我而言,業務要求迫使它 - 實際上是hacky。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.