2010-06-21 117 views
6

我想创建一个扩展ActiveRecord :: Base的模型'Relation',将其表名设置为'questions_tags',并且没有主键。我该怎么办?如何在没有主键的情况下创建模型

class Relation < ActiveRecord::Base 
    set_table_name 'questions_tags' # set table name, right? 

    # how to define 'no-pk'? 

end 

UPDATE


嗨,伙计们。我知道使用'create_table'可以解决这个问题,但这正是我想知道的:create_table(:id=>false)背后的魔法是什么?如何在不使用create_table(:id=>false)的情况下获得相同的效果?

+1

据我没有魔法。 'create_table'有一个额外的选项,不管是否必须创建'id'-列。就这样。当你要求“魔法”时:你的意思是代码,生成的sql语句,还是别的......? – nathanvda 2010-06-21 13:07:53

+1

如果你想知道幕后发生了什么,我会建议在Rails API文档中挖掘depper: http://api.rubyonrails.org/classes/ActiveRecord/Base.html, http:// api .rubyonrails.org/classes/ActiveRecord/Migration.html, http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html – auralbee 2010-06-21 13:27:51

+0

@ nathanvda,auralbee:谢谢你们俩。我刚接触rails,也许我需要阅读更多关于ActiveRecord的文章。 – Freewind 2010-06-22 03:18:47

回答

8

创建迁移,看起来像这样:

class CreateQuestionsTags < ActiveRecord::Migration 

    def self.up 
    create_table :questions_tags, {:id => false, :force => true} do |t| 
    ... 
    t.timestamps 
    end 
    end 

    def self.down 
    drop_table :questions_tags 
    end 

end 
+0

感谢您的回答。请看我更新的问题 – Freewind 2010-06-21 12:25:08

1

如果您希望创建数据透视表,因为它看起来像表名,那么AR会在后台处理它。

但是,如果你正在寻找创造更多精密组件则表: 1)重命名表“关系基本”请 2)使用一个主键“ID”

有没有很好的理由不要在表格中使用主键,而且很可能以后您很可能会后悔自己。

+0

谢谢。请看我更新的问题,我只想知道发生了什么。 – Freewind 2010-06-21 12:26:37

-7

为什么你不想PK?

活动记录预计PK,我不明白它可以做什么伤害。

+0

谢谢。因为它是一个连接表,我不希望它有一个PK – Freewind 2010-06-21 12:25:37

+3

如果你正在创建遗留数据库映射,那很好,但在ActiveRecord模式/设计中的连接表有主键。这是一个可以让你的生活变得更轻松或者不断对抗的惯例。 – nessur 2012-04-18 19:05:26

+3

有很多时候你不会想要一个主键。在基于非主键列进行大量插入和读取的报表上,您可能需要尽可能少的索引。有一个主键列,你不会使用除了慢插入。 – WattsInABox 2012-06-15 18:24:03

相关问题