Rails中有一个额外列的多对多表

时间:2012-12-09 22:18:02

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

  你好!只能使用两个Rails模型,User和   事件:

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为   确认)。如何在没有模型的情况下使用Rails ActiveRecord执行此操作   “Event_User”?如何操作用户中的已确认列   模型?

     

我正在使用Rails 3.2.9

3 个答案:

答案 0 :(得分:5)

UserEventmany-to-many关系,您不能仅使用2个模型设置此关联,您必须具有连接模型或连接表。

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

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

答案 1 :(得分:3)

不使用用户模型,而是使用关系

has_and_belongs_to_many :events

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

最好使用带有两个 belongs_to 关系的模型确认:

belongs_to :user
belongs_to :event

我希望这可以帮到你, 的Alessandro

答案 2 :(得分: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的位置提供用户事件。