【问题标题】:Rails association primary_key optionRails 关联 primary_key 选项
【发布时间】:2014-06-15 23:48:52
【问题描述】:

我了解外键用于指定子类何时具有不同的列名(不同于父子类的类名)。我知道主键和外键是什么,并且已经多次阅读有关关联的 rails 文档,但我无法弄清楚主键选项的用途。

1) 但是primary_key 选项有什么用呢?调用关联时如何改变sql?

2) 在什么情况下您需要在关联时指定 primary_key?

3) 在什么情况下您需要同时指定 primary_key 和 foreign_key?

以下是在关联上指定 foreign_key 选项的示例:

class User
has_many :texts, foreign_key: :owner_id

end

class Text
belongs_to :user, foreign_key: :owner_id

end


User Table
id| name |

Text Table
id| owner_id |name

【问题讨论】:

    标签: ruby-on-rails associations primary-key rails-activerecord model-associations


    【解决方案1】:

    好的,所以我对 SQL 进行了更多思考并想通了。当您的孩子的 foreign_key 名称与您父母的 classname_id 不同但在您的 parent 表上时,您使用 foreign_key 选项,您仍然使用 ID 作为您的标识符。

    user table
    id|name|age
    
    text table
    id|random_id|conversations
    
    select * from user where user.id = text.random_id
    
    select * from text where text.random_id (foreign_key) = account.id (primary key)
    

    另一方面,当您根本不想使用 id 来链接关系时,您可以使用 primary_key 和 foreign_key。

    user table
    id|userable_id|name|age
    
    text table
    id|userable_ss_id|conversations
    

    这里:如果您想将 userable_ss_id 链接到 userable_id,您将在两个关系中包含 primary_key 和 foreign_key 选项。

    class User 
    has_many :texts, primary_key: :userable_ss_id, foreign_key: :userable_id
    end
    
    class Text 
    belongs_to :user, primary_key: :userable_ss_id, foreign_key: :userable_id
    end
    

    基本经验法则:

    select * from text where text.(foreign_key) = account.(primary key)
    

    【讨论】:

      【解决方案2】:

      主键与主表有关,外键与关联表有关

      你已经正确使用了外键。如果例如用户有另一个主键而不是 :id 你必须指定。

      #User
       has_many :texts, primary_key: :uuid, foreign_key: owner_id
      

      所以你需要这个选项,如果你想对键进行另一个命名,而不是 rails 约定分别为主表和关联表假设

      【讨论】:

        【解决方案3】:

        Rails 使用约定优于配置。

        按照惯例,rails 中的所有数据库表都有一个主键 id 列。

        如果出于某种奇怪的原因(例如,您有一个旧数据库),您的表使用与 id 不同的主键...您使用 primary_key 调用来告诉 rails 它是什么。

        按照惯例,所有关联都使用<model>_id 作为外键。

        如果由于某种原因,您的关联使用不同的外键来查找关联模型 - 您将使用 foreign_key 告诉 rails 它是什么。

        primary_key 不同,使用foreign_key 可能更常见。尤其是当您有多个关联使用同一个表但关联名称不同时。

        【讨论】:

        • 好的,我知道大部分,但为什么需要直接在关联上指定primary_key?你能描述一下我指定primary_key时发生的sql变化吗
        • 不容易......再次归结为需要更改的默认行为。我猜想任何按 id 的默认排序都会更改为按主键字段的默认排序...如果您对关联进行查找,则构建的 sql 将使用主键列而不是身份证等
        猜你喜欢
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多