【问题标题】:Rails has_one association confusionRails has_one 关联混淆
【发布时间】:2014-03-11 07:09:24
【问题描述】:

我是 Rails 的新手,我想创建一个具有一个地址的人员模型和一个具有一个地址和一个人员的公司模型。

这是我到目前为止所做的

$ rails generate model Address street:string suburb:string 

$ rails g scaffold Person name:string address:references

$ rails g scaffold Company name:string person:references address:references


    class Address < ActiveRecord::Base
      belongs_to :person
      belongs_to :company
    end

    class Person < ActiveRecord::Base
      has_one :address
    end

    class Company < ActiveRecord::Base
      has_one :person
      has_one :address
    end

显然我错过了一些东西。 Address 需要多态关联吗?

我很迷茫,所以任何指导将不胜感激。

干杯

【问题讨论】:

    标签: ruby-on-rails-4 associations polymorphic-associations


    【解决方案1】:

    您缺少外键和/或将它们放在不正确的位置。请记住,“子”模型中需要外键。这就是拥有的模型。 Personhas_one 地址也是如此,该地址被拥有,并且应该包含一个引用该 Person 的外键。

    外键是数据库中的一列,或模型中的一个属性,它保存关联的拥有者模型的 id。例如,belongs_to 一个 Person 的 Address 模型在数据库中将如下所示:

    Address -->   | address_id  | person_id | street | suburb |
    

    如果它属于个人和公司,它应该如下所示。

    Address --> | address_id  | person_id | company_id | street | suburb |
    

    你应该像这样生成你的脚手架代码,而不是上面的:

    $ rails generate model Address street:string suburb:string person_id:integer company_id:integer
    
    $ rails g scaffold Person name:string
    
    $ rails g scaffold Company name:string
    

    您的模型代码看起来不错。请注意,Rails 更喜欢“配置约定”,因此 Address 模型中的 belongs_to :person 将通过“约定”告诉 rails 在地址表中查找 person_id 形式的外键。

    【讨论】:

    • 谢谢。我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多