我很难找到合适的组合来设置我的外键。无论我做什么,我的控制台仍然在读取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
答案 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