苦苦于复杂的Rails activerecord关联和连接模型

时间:2013-06-25 13:19:14

标签: ruby-on-rails-3 activerecord polymorphic-associations single-table-inheritance model-associations

我对Rails相当新,我真的很欣赏一些正确方向的指示。 我理解STI的利弊。

在Rails 3.2中结合使用单表继承和多态关联来建模AR关系的最佳实践是什么?决定使用两者都会有这个appproach的任何重要缺点吗? Rails 4会改变什么吗?

到目前为止,我有以下型号:

    class Course
      has_many :participants, class_name: 'User'
      has_many :events, as: :eventable
    end

    class User
      has_many :events, as: :eventable
      has_many :courses
    end

    class Resource
      has_many :events, as: :eventable
    end

    class Subject < Resource
    end

    class Location < Resource
    end

    class Medium < Resource
    end

    class Event
      belongs_to :eventable, polymorphic: true
    end

到目前为止看起来相对容易,但我正在努力解决复杂的关联问题。 我如何设置以下与STI的关联?

  • 课程可以有很多资源(作为科目/地点)
  • 用户可以拥有许多资源(作为主题/位置)
  • 资源可以包含许多用户(作为联系人)
  • 活动本身可以有其他用户(作为教师)
  • 事件本身可以有其他资源(作为位置/主题/媒体)

我想从数据库中检索的内容

  • 用户的所有活动
  • 课程的所有活动
  • 参与者的所有组合事件(用户和课程)
  • 来自事件的类型位置的所有关联资源
  • 来自活动的所有相关教师
  • 课程类型位置的所有资源
  • 来自用户的所有类型主题资源

TIA和最好的问候

克里斯

1 个答案:

答案 0 :(得分:1)

你会使用那些,以及更多Rails的魔法:)

class Course
  has_many :participants, class_name: 'User'
  has_many :subjects, conditions: ['type = ?', 'Subject']
  has_many :locations, conditions: ['type = ?', 'Location']
  has_many :events, as: :eventable
end

class User
  has_many :subjects, conditions: ['type = ?', 'Subject']
  has_many :locations, conditions: ['type = ?', 'Location']
  has_many :events, as: :eventable

  belongs_to :event, foreign_key: :teacher_id
end

class Resource
  has_many :contacts, class_name: 'User'
  has_many :events, as: :eventable
end

class Event
  belongs_to :eventable, polymorphic: true
  has_many :teachers, class_name: 'User'

  has_many :subjects, conditions: ['type = ?', 'Subject']
  has_many :locations, conditions: ['type = ?', 'Location']
  has_many :media, conditions: ['type = ?', 'Medium']
end

我认为这涵盖了所有用例。

注意:您可能应该将模型从Media重命名为Medium,因为Rails可以更好地处理单一化的模型名称,如果不这样做,可能会遇到一些问题。