fr0*_*man 26 ruby activerecord ruby-on-rails
所以我有两个模型,State和Acquisition.State has_many收购.我觉得51个记录的自动增量整数主键是相当愚蠢的.所以我将State的模型改为PK(State是两个字母的缩写;我没有在任何地方存储实际的州名:
class State < ActiveRecord::Base
self.primary_key = "state"
has_many :acquisition_histories
end
Run Code Online (Sandbox Code Playgroud)
问题是当我创建我的Acquisition模型时,它创建了外键列state_id作为整数.更具体地说,脚本/生成的迁移确实:
class CreateAcquisitions < ActiveRecord::Migration
def self.up
create_table :acquisitions do |t|
t.date :date
t.string :category
t.text :notes
t.references :state
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
我假设t.references数据类型将其设置为int.问题是我的Acquisition类上的create方法试图将状态缩写放入表获取的state_id字段中(是的,它在数据库上称为state_id,即使它表示:迁移脚本中的状态).该方法不会失败,但它会在state_id字段中输入0并且记录进入以太.
mki*_*irk 36
虽然,我同意这可能比考虑在其他地方违反默认值的额外努力更值得考虑,以防万一你真的想要做你所问的事情:
创建状态迁移:
class CreateStatesTable < ActiveRecord::Migration
def change
create_table :states, id: false do |t|
t.string :state, limit: 2
t.string :name
t.index :state, unique: true
end
end
end
Run Code Online (Sandbox Code Playgroud)
国家模型:
class State < ActiveRecord::Base
self.primary_key = :state
end
Run Code Online (Sandbox Code Playgroud)
请注意,在Rails 3.2之前,这set_primary_key = :state不是self.primary_key=看到:http://guides.rubyonrails.org/3_2_release_notes.html#active-record-deprecations
Wil*_*elm 32
如果你发现自己在这里...尽可能快地离开并转到: 使用Rails,如何将我的主键设置为不是整数类型的列?
blo*_*ilk 14
在 Rails 5.1 中,您可以在创建时指定主键的类型:
create_table :states, id: :string do |t|
# ...
end
Run Code Online (Sandbox Code Playgroud)
从文档:
Symbol 可用于指定生成的主键列的类型。
Joh*_*ley -28
当您不反对默认设置时,Rails 会发挥最佳效果。在状态表上使用整数主键有什么危害?
除非您陷入无法控制的遗留模式,否则我建议您坚持 Rails 默认设置(约定优于配置,对吗?)并专注于应用程序的重要部分,例如 UI 和业务逻辑。
| 归档时间: |
|
| 查看次数: |
31742 次 |
| 最近记录: |