背景:用户和社区共享一个
has_many:通过
关系。每个社区都有一个标识它的“community_type”字符串(即“Gender”、“City”等)。
目标:在我的编辑表单中,我想允许用户根据社区类型编辑他的 :community_ids。就像是:
<%= form_for current_user do |f| %> <%= f.collection_select(:community_ids, Community.filtered_by("Gender"), :id, :name) %> <%= f.collection_select(:community_ids, Community.filtered_by("City"), :id, :name) %> <% end %>
问题是表单只接受 :community_ids 的最后一个表单字段值 - 在这种情况下是“城市” - 而不是将它们全部合并为一个大的 :community_ids 数组。
解决方案:
对于那些感兴趣的人,我最终从以下答案重构了我的模型代码:
%W[ community1 community2 community3 community4 ].each do |name|
define_method "#{name}" do
self.communities.filtered_by("#{name}").map(&:name)
end
define_method "#{name}_ids" do
self.communities.filtered_by("#{name}").map(&:id)
end
define_method "#{name}_ids=" do |val|
self.community_ids += val
end
end