Rails中的简单SQL连接

时间:2011-06-22 15:48:03

标签: ruby-on-rails

我有一个用户表和一个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表中)。如果我出错了,这一定很简单吗?

3 个答案:

答案 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测试