如何通过连接表中的枚举创建关系?

时间:2016-01-20 09:57:20

标签: ruby-on-rails ruby enums relationships

我想在simple_form <%= f.association :organisators, collection: User.all %><%= f.association :helpers, collection: User.all %>中选择它们的来源是用户ID存储在参与联接表中的适当枚举类型,是否可以通过ActiveRecord关系自动执行?

class Participation < ActiveRecord::Base
  belongs_to :user
  belongs_to :event

  enum kind: [:helper, :organisator]
end

class Event < ActiveRecord::Base
  belongs_to :user

  has_many :participations
  has_many :organisators, class_name: 'Participation'
  has_many :helpers, class_name: 'Participation'
end

class User < ActiveRecord::Base
  has_many :events
  has_many :participations
end

当我尝试保存当前版本时,它会引发:Couldn't find Participation with 'id'=1

event_params: {"helper_ids"=>["2"], "organisator_ids"=>["1"]}

2 个答案:

答案 0 :(得分:2)

  

它们的来源将是存储在参与联接表中的用户ID

您需要从Participation模型中提取而不是 User模型:

class Participation < ActiveRecord::Base
  belongs_to :user
  belongs_to :event

  enum kind: [:helper, :organisator]
end

class Event < ActiveRecord::Base
  belongs_to :user

  has_many :participations
  has_many :organisators, -> { where kind: :organisator}, class_name: 'User', through: :participations, source: :user
  has_many :helpers,      -> { where kind: :helper}, class_name: "User", through: :participations, source: :user
end

class User < ActiveRecord::Base
  has_many :events

  has_many :participations
  has_many :participated_events, through: :participations
end

你基本上有has_many :through关系。

-

因此,您能够使用:

#app/views/events/update.html.erb
<%= simple_form_for @event do |f| %>
   <%= f.association :organisators, collection: @event.organisators %>
   <%= f.association :helpers, collection: @event.helpers %>
   <%= f,submit %>
<% end %>

如果你给出了一些关于你想要达到的目标的背景,那将会有所帮助。上面的代码应该有所帮助,我们可能需要调整一下。

答案 1 :(得分:1)

我建议在枚举上使用单表继承。保留现有的Participation模型,并创建另外两个将继承它的模型(帮助器和组织器)。

一旦实现了这一点,就可以有两种不同的对象类型,可以在共享一个数据库模型时通过关系引用。

看一下这个文档: http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html