5

是否可以仅使用两个 Rails 模型,用户和事件:

Users
|id        |name         |age         |
|1         |danilo       |26          |
|2         |joe          |23          |
|3         |carlos       |50          |
|4         |katy         |45          |

Events_Users
|event_id     |user_id        |confirmed       |
|1            |1              |1               |
|3            |3              |0               |
|4            |3              |1               |
|2            |3              |1               |

Events
|id           |name                     |date            |
|1            |the end of the year      |31/12/2012      |
|2            |the end of the world     |21/12/2012      |
|3            |Party                    |18/12/2012      |
|4            |Dinner                   |19/12/2012      |

问题是,用户可以确认他们是否存在于事件中,为此我使用了表 Events_Users,列已确认(1 表示已确认)。我如何在没有模型“Event_User”的情况下使用 Rails ActiveRecord 做到这一点?如何操作 User 模型中的已确认列?

我正在使用 Rails 3.2.9 。

4

3 回答 3

5

User并且Eventmany-to-many关系,你不能只用2个模型建立这个关联,你必须有连接模型,或者连接表。

在您的情况下,您添加了属性confirmed,因此您需要一个名为Confirmation的连接模型(正如其他人推荐的那样)。您定义的关联将如下所示:

class User
  has_many :events, through: :confirmations
  has_many :confirmations
end

class Event
  has_many :users, through: :confirmations
  has_many :confirmations
end

class Confirmation
  belongs_to :user
  belongs_to :event
end
于 2012-12-10T02:40:48.347 回答
3

而不是用于用户模型,与关系

has_and_belongs_to_many :events

并修改连接表Events_Users(有点脏)

最好使用具有两个belongs_to关系的模型 Confirmation:

belongs_to :user
belongs_to :event

我希望这可以帮助你,亚历山德罗

于 2012-12-10T00:36:23.030 回答
0

由于您在连接表上有额外的字段,因此您需要一个连接模型。看一下这个:

class User
  has_many :invitations
  has_many :invited_events,   -> {where(confirmed: false)}, class_name: 'Event', through: :invitations
  has_many :confirmed_events, -> {where(confirmed: true)},  class_name: 'Event', through: :invitations
end

class Event
  has_many :invitations
  has_many :invited_users,   -> {where(confirmed: false)}, class_name: 'User', through: :invitations
  has_many :confirmed_users, -> {where(confirmed: true)},  class_name: 'User', through: :invitations
end

class Invitation
  belongs_to :user
  belongs_to :event
end

这样,user.confirmed_events将仅在连接表中已确认标志设置为 true 的情况下提供用户事件。

于 2013-12-10T19:57:43.137 回答