【问题标题】:ActiveRecord has_many and belongs_to implementations for foreign key外键的 ActiveRecord has_many 和 belongs_to 实现
【发布时间】:2019-09-26 19:53:41
【问题描述】:

我试图了解 has_many 和 belongs_to 关联中输入选项哈希背后的语法/动机。 (底部的问题)

假设我有两个表,用户和帖子。 一个用户有很多帖子,一个帖子属于一个用户。据我了解,人们会建立这样的关联:

(在用户模型中)

has_many(:posts,
    primary_key: :id,
    foreign_key: :user_id, #this makes me think SQL is querying
                           #User.user_id, an invalid field
    class_name: "Post")

(在 Post 模型中)

belongs_to(:user,
    primary_key: :id,
    foreign_key: :user_id, 
    class_name: "User")

我的问题如下: 怎样才能直观地理解为什么函数belongs_to 和has_many 是这样实现的?即,为什么在更改您定义的关联时不期望 foreign_key 改变?因为,天真地,我希望使用不同的外键定义关联,具体取决于您的查询源自哪个表(即 class_name 表)。这只是约定俗成的问题吗?

我查看了 has_many/belongs_to 的文档,我想我理解它们是如何实现的,但我仍然不明白 /why/ 它是这样实现的。我觉得维护一个恒定的外键,独立于您正在查询的表,混淆了 SQL 级别上发生的事情。 (但我希望我只是错过了一些愚蠢的东西)

编辑: 为了清楚起见,这是我天真地认为更有意义的关联:

在用户模型中

has_many(:posts,
    primary_key: :user_id, #because querying post table so treat this column
                          #as a primary key

    foreign_key: :id,      #because users is the 'secondary' table,  
                          #:id should be foreign
    class_name: "Post"
)

在 Post 模型中

belongs_to(:user,
    primary_key: :id, #because querying User table, treat this as the
                     #primary key

    foreign_key: :user_id,  #because posts is the 'secondary' table we are 
                            #comparing to, :user_id should be foreign
    class_name: "User")

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    嘿,我在发布我的问题后不久就意识到了(这绝对是愚蠢的): 我在想主要/外国分别说明正在查询哪个表以及正在加入哪个表。实际上,当我应该考虑哪个键是真正主要的和外来的w.r.t。数据库。我怀疑这对任何人都有帮助,但会留下它以防万一,因为它让我头疼(即使它可能不应该)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多