Ruby on Rails:如何为人员和组织建模?

时间:2012-10-04 11:06:20

标签: ruby-on-rails ruby ruby-on-rails-3

我目前正在构建一个Rails应用程序,其中用户可以包含许多,而这些人可以拥有多个项目

这非常有效。

现在我的问题是某些人可能属于同一个组织,而其他人可能根本不属于任何组织。

根据我迄今所学到的知识,将与组织相关的所有信息转移到单独的表/模型中会很好。 (如果我错了,请纠正我。)但如果一个人不属于任何组织,即属于私人,会发生什么呢? 如何在Rails中建模所有这些?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您的问题是否简单,您的人员可能属于或可能不属于某个组织。现在你将如何设置它?

现在正如您所说,您将把组织相关数据移到另一个表中organizations。您的persons(或people?)应包含organization_id如果此人不属于任何组织,那么就会为空。模型关系有点像。

class Person < AR::Base
    belongs_to :organization
end

class Organization < AR::Base
    has_many :persons #or people?
end

我在这里跳过了与UserProject模型的关系。如果我错过了你问题的任何部分,请告诉我。


更新: 根据您的上次评论
让我们列出你的场景:

  1. 一个人和一个组织都可以有地址。
  2. 如果某人不属于某个组织,那么此人可能拥有自己的地址。
  3. 如果他属于某个组织,那么他的地址实际上就是该组织的地址。或者可能有自己的地址。
  4. 如果address是个人和组织中唯一重复的事情,那么最好将其移到单独的表addresses中。

    组织: has_one :address
    人: has_one :address


    更新2:

    因为事情有点像条件

    • 如果某人属于组织,则person.address将返回组织地址。
    • 否则person.address将返回自己的地址。

    然后我更喜欢以下方式来保持简单。在current_address模型中添加Person (或任何首选名称)方法。

    def current_address
        return organization.address if organization
        return address
    end
    

    致电person.current_address而不是person.address来完成决策。

答案 1 :(得分:1)

据我了解情况:

Situation

您可以通过以下方式将此情况转换为rails:

class Organisation < ActiveRecord::Base
  has_many :persons
end

class Person < ActiveRecord::Base
  belongs_to :user
  belongs_to :organisation
end

class User < ActiveRecord::Base
  has_many :persons
end

答案 2 :(得分:0)

试试这可能对你有所帮助

class Person < ActiveRecord::Base
 belongs_to :organization
end
class Organization < ActiveRecord::Base
 has_many :persons 
end

如果人属于组织,那么在组织表person_id中,如果其他人不属于组织,那么在组织表中person_id为零。这样

in your console
-> product = @product.organization  
    # if person_id given then you get result
    # if person_id does not given then get null or blank