如何为模型设置外键

时间:2013-09-11 13:50:12

标签: ruby-on-rails

我很难找到合适的组合来设置我的外键。无论我做什么,我的控制台仍然在读取zip_ids时,它应该只是zip_codes。

我在控制台收到了这个:

Zip.code(30052).users.count
  Zip Load (12.5ms)  SELECT `zips`.* FROM `zips` WHERE `zips`.`code` = 30052 LIMIT 1
   (0.3ms)  SELECT COUNT(*) FROM `users` WHERE `users`.`zip_code` = 12859
 => 0 

问题是第二行它以某种方式拉动邮政编码12859,我从未指定过。这是因为它在用户表中使用了zip_id而不是zip_code。

zip.rb:

 has_many :users,  :foreign_key => "zip_code"

user.rb:

  belongs_to :zip

1 个答案:

答案 0 :(得分:1)

将代码设置为主键

class Zip < ActiveRecord::Base
  self.primary_key = 'code'
  has_many :users, foreign_key: 'zip_code'
end

不要忘记在代码列中添加唯一索引:

class AddIndexToZipsCode < ActiveRecord::Migration
  def change
    add_index :zips, :code, unique: true
  end
end

并验证code

的唯一性
# zip.rb
validates :code, uniqueness: true

然后你会找到一个zip Zip.find(code)

zip_code表格上为users添加索引。

class AddIndexToUsersZipCode < ActiveRecord::Migration
  def change
    add_index :users, :zip_code
  end
end

现在,Zip.find(code).users.count应该有效。

要使反向关系起作用(user.zip),您需要在关联中指定foreign_key:

# user.rb
belongs_to :zip, foreign_key: :zip_code