【问题标题】:How to create belongs_to connections in some cases, Rails 4如何在某些情况下创建 belongs_to 连接,Rails 4
【发布时间】:2014-03-25 01:18:58
【问题描述】:

您好,关于 Rails belongs_to 关联的快速问题。

在一个示例中,我们必须对 Foo 和 Hah 进行建模。

    class Foo < ActiveRecord::Base
    end


    class Hah < ActiveRecord::Base
       belongs_to :foo
    end

标准的东西。但是我的问题来了。我如何为模型 Hah 的每条记录都有一个 foo_id 创建代码,但并非模型 Foo 的每条记录都以这种方式与 Hah 模型相关联。

## Table foos ##

  id     post

   1     stuff

   2     dancing

   3     now


## Table hahs ##

  id     line     a_id

   1     fill      2

   3     this      3

感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 associations belongs-to


    【解决方案1】:

    由于FooHuh 的命名,这个问题有点含糊,但这是我能回答的最佳答案...

    Active Record Documentation所述

    2.1) belongs_to 关联建立与另一个模型的一对一连接,这样声明模型的每个实例“属于”一个另一个模型的实例。例如,如果您的应用程序包含客户和订单,并且每个订单只能分配给一个客户,您可以这样声明订单模型:

    class Order < ActiveRecord::Base
      belongs_to :customer
    end
    

    2.2) has_one 关联还建立了与另一个模型的一对一连接,但语义(和结果)有所不同。这种关联表明模型的每个实例都包含或拥有另一个模型的一个实例。例如,如果您的应用程序中的每个供应商只有一个帐户,您可以像这样声明供应商模型:

    class Supplier < ActiveRecord::Base
      has_one :account
    end
    

    2.7) 在belongs_tohas_one 之间进行选择 如果您想在两个模型之间建立一对一的关系,您需要将 >belongs_to 添加到一个模型,并将 has_one 添加到另一个模型。你怎么知道哪个是哪个?

    区别在于您放置外键的位置(它在表中为声明belongs_to 关联的类提供),但您也应该考虑数据的实际含义。 has_one 关系表明某物是你的——也就是说,某物指向你。例如,说供应商拥有客户比说客户拥有供应商更有意义。这表明正确的关系是这样的:

    class Supplier < ActiveRecord::Base
      has_one :account
    end
    
    class Account < ActiveRecord::Base
      belongs_to :supplier
    end
    

    关于有零个或一个关系 我认为您正在寻找的“零或一”关系是 has_one 关系。此关系不是强制性的(除非您向其添加验证)。 还要检查this question...如果每个帐户都需要有一个有效的供应商,通常 Account 类将如下所示

    class Account < ActiveRecord::Base
      belongs_to :supplier
      validates_presence_of :supplier
    end
    

    【讨论】:

    • 感谢您的帮助,我假设 has_one 是确定的,事实上它必须有一个。 :) 如果您好奇这种情况是根据用户的角色(rolify)设计具有或不具有子存储模型的用户
    • 很高兴我能帮上忙...所有关系都不需要 FK 存在,而是您必须进行验证才能强制关系存在...我更新了回答添加一个示例来验证该帐户是否需要有一个有效的供应商..
    【解决方案2】:

    我认为您正在寻找这样的东西:

    迁移:

    def change do
      create_table :foos do |t|
        t.string :post
        t.timestamps
      end
    
      create_table :hahs do |t|
        t.references :foo, null: false
        t.string :line
        t.timestamps
      end
    end
    

    型号:

    class Foo < ActiveRecord::Base
      has_many :hahs
    end
    
    class Hah < ActiveRecord::Base
      belongs_to :foo
      validates :foo, presence: true
    end
    

    hahs 表中的 null: false 位将确保在数据库级别不属于 Foo 的情况下无法创建 Hah,而 validates 行确保 ActiveRecord 不允许创建不属于的 Hah到 Ruby 级别的 Foo。

    【讨论】:

    • 谢谢您的回答。有关身份验证的信息将是最有帮助的。
    猜你喜欢
    • 2013-05-21
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2012-04-01
    • 2015-04-28
    相关资源
    最近更新 更多