2011-06-22 38 views
0

我有一個用戶表和一個池表。 users表有一個名爲facebook_id的列,我想將它設置爲primary_key。泳池表格有一個名爲creator_facebook_id的列。在Rails中簡單的SQL加入

我想執行一個簡單連接,其中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 

,並返回與池關聯的名稱(存儲在用戶表)。這一定很簡單,我哪裏錯了?

+0

的foreign_key應該是兩個關聯映射(creat or_facebook_id)。獲取ActiveRecord以將facebook_id用作User類的主鍵是一個不同的問題。 – Rafe

回答

2

如果你確實已經設置facebook_id作爲對用戶表的主鍵,您將需要告知的這個導軌。沒有可用於關聯一個:primary_key選項,所以你可以使用這個在您的池模型:

belongs_to :user, :primary_key => 'facebook_id', :foreign_key => 'creator_facebook_id' 

這應該允許您使用Pool.user。不幸的是,讓ActiveRecord與非標準主鍵很好地配合是另一個問題。我建議你只要讓id列成爲主鍵,並在facebook_id列中添加索引即可。

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 
+0

這些是類名的默認值,所以這不會有幫助。 – coreyward

+0

當然,你是對的。 – pcg79

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測試和軌道3.0.7