如何在Rails中设置外键

时间:2016-09-13 07:41:58

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我有一个名为employee的模特。以下是我的迁移文件。

class CreateEmployees < ActiveRecord::Migration
    def change
        create_table :employees, id: false do |t|
            t.string :name
            t.string :password
            t.string :role
            t.primary_key :name
        end
    end
end

现在,我想创建一个名为“teamplayer”的模型,其列为“name”,需要在employee模型中引用“name”列。并且'tl'专栏 这与该模型无关。以下是我的“teamplayer”迁移文件。

class CreateTeamplayers < ActiveRecord::Migration
    def change
        create_table :teamplayers, :id false do |t|
            t.string :tl
            t.string :name
        end
    end
end

在上面的文件中,如何将“name”列引用给模型员工?那么如何在rails中实现外键。

2 个答案:

答案 0 :(得分:0)

我想你想研究一下Active Record Associations(http://guides.rubyonrails.org/association_basics.html

我知道您已经要求在name上创建外键,但除非您打算确保该名称是唯一的,否则这可能不是最好的计划(取决于您尝试建模的实际关系) - 一对多/一对一等)。

我很想在employees.id上设置外键关系。为此,您可以使用has_manybelongs_to关联。

您可以按如下方式更改teamplayers迁移:

class CreateTeamplayers < ActiveRecord::Migration
  def change
    create_table :teamplayers, :id false do |t|
        t.belongs_to :employee
        t.string :tl
    end
  end
end

然后在您的Employee模型中,您可以添加has_many方面的内容:

class Employee < ActiveRecord::Base
  has_many :teamplayers
end

通过简单的连接,您仍然可以轻松获得Teamee队列记录的员工姓名。

编辑 - 为了获得员工,你可以做这样的事情,假设@t是一个teamplayer实例:

@t.employee.name

(代码未经测试且来自内存......)

答案 1 :(得分:0)

您可以在teamplayer模型中执行此操作,只需在迁移中添加索引

//this is my model
public function uproQ($data)
{
    return $this->db->insert('products',$data);
}

您可以在员工模型中将名称设置为主键,如此

class CreateTeamplayers < ActiveRecord::Migration
  def change
    create_table :teamplayers, :id false do |t|
        t.string :tl
        t.string :name
    end
    add_index :teamplayers, :name
  end
end

现在在模型Teamplayer中你可以设置外键

class Employee < ActiveRecord::Base
  self.primary_key = "name"
  has_many :teamplayers
end

这应该引用员工模型的“名称”