1

(Ruby/Rails 大师最好:P)

我有一个有趣的问题。希望它还没有回答(等等,是的,我知道了!)但我已经看过但找不到它。(希望不是因为不可能)

我有两个班级(我想保持这种状态)组和事件(见下文)。

class Group < ActiveRecord::Base
    has_and_belongs_to_many :events
end

但是,在我的连接表 (group_events) 中,我有额外的列为事件提供了情有可原的情况......我希望这些信息在事件对象上可用。(例如,是否必须出席等)

我的第二个稍微相关的问题是,我可以不做以下事情:

class Event < ActiveRecord::Base
    has_and_belongs_to_many :groups
end

class GroupEvent < Event
    # Implies that a GroupEvent would be an Event, with all the other attributes of the group_events table minus the
    # two id's (group_id, event_id) that allowed for its existence (those would just be references to the group and event object)
end
4

1 回答 1

3

我将首先重写,明确描述和模型has_and_belongs_to_many之间的关系。EventGroupEvent

class Group < ActiveRecord::Base
  has_many :group_events
  has_many :events, :through => :group_events
end

class Event < ActiveRecord::Base
  has_many :group_events
  has_many :groups, :through => :group_events
end

class GroupEvent < ActiveRecord::Base
  belongs_to :group
  belongs_to :event
end

然后,您可以在Event类中的方法引用您之后的 GroupEvent 属性。对于中的一些布尔:attendance_mandatory属性GroupEvent,您可以执行类似的操作

class Event < ActiveRecord::Base
  has_many :group_events
  has_many :groups, :through => :group_events

  def attendance_mandatory?(group)
    group_events.find(group.id).attendance_mandatory?
  end
end

有了一些Eventase和关联Groupas g,你现在可以做

e.attentdance_mandatory?(g)

至于您的第二个问题,我认为您正在寻找我在上面第一个代码块中发布的内容。

class GroupEvent < ActiveRecord::Base
  belongs_to :group
  belongs_to :event
end

每个包含您希望与之交互的数据的表都应该在您的应用程序中具有代表性模型。以上符合您规定的标准(公开 a 的属性GroupEvent

注意:您的语法class GroupEvent < Event用于单表继承 (您可以将属性attendance_mandatory移到events表中,并将该events表用于常规Event和 a GroupEvent- 尽管这超出了本问题的范围)

于 2012-07-08T23:35:08.163 回答