我有一个用户表和一个pool表。 users表有一个名为facebook_id的列,我想将其设置为primary_key。 pool表有一个名为creator_facebook_id的列。
我想执行一个简单的连接,其中users.facebook_id = pools.creator_facebook_id
我试图通过将以下代码放入我的模型
来通过活动记录来完成此操作class Pool < ActiveRecord::Base
belongs_to :user, :foreign_key => "facebook_id"
end
class User < ActiveRecord::Base
has_many :pools, :foreign_key => "creator_facebook_id"
end
然后,当我有一个池列表时,我希望能够做这样的事情
pool.user.name
并返回与池关联的名称(存储在users表中)。如果我出错了,这一定很简单吗?
答案 0 :(得分:2)
如果您确实已将facebook_id
设置为Users表上的主键,则需要通知Rails。有一个:primary_key
选项可用于关联,因此您可以在Pool模型上使用它:
belongs_to :user, :primary_key => 'facebook_id', :foreign_key => 'creator_facebook_id'
这应该允许您使用Pool.user
。不幸的是,让ActiveRecord与非标准主键很好地配合是另一个问题。我建议您只需将id
列作为主键即可,并在facebook_id
列上添加索引。
答案 1 :(得分:0)
我相信你错过了班级名称。
class Pool < ActiveRecord::Base
belongs_to :user, :class_name => 'User', :foreign_key => "facebook_id"
end
class User < ActiveRecord::Base
has_many :pools, :class_name => 'Pool', :foreign_key => "creator_facebook_id"
end
答案 2 :(得分:0)
迁移:
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users, :primary_key => 'facebook_id' do |t|
t.string :name
end
end
def self.down
drop_table :users
end
end
class CreatePools < ActiveRecord::Migration
def self.up
create_table :pools do |t|
t.integer :creator_facebook_id
t.string :name
end
end
def self.down
drop_table :pools
end
end
模型:
class User < ActiveRecord::Base
set_primary_key 'facebook_id'
has_many :pools, :foreign_key => "creator_facebook_id"
end
class Pool < ActiveRecord::Base
belongs_to :user, :foreign_key => "creator_facebook_id"
end
这将允许:
pool.user.name
使用sqlite和rails 3.0.7测试