我想在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"]}
答案 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