代码:
商业模式
class Business < ApplicationRecord
has_many :business_categories
has_many :categories, through: :business_categories
......
end
类别模型
class Category < ApplicationRecord
has_many :services
has_many :business_categories
has_many :businesses, through: :business_categories
.....
end
业务类别模型
class BusinessCategory < ApplicationRecord
belongs_to :business
belongs_to :category
has_many :business_category_services
has_many :services, through: :business_category_services
....
end
class Service < ApplicationRecord
belongs_to :category
end
和我想设计的表格,请查看下面的快照。
请看一下快照
form do |f|
f.inputs 'Business' do
f.input :name
f.input :category_ids, as: :check_boxes, collection: Category.all.map{|category| [category.name, category.id]}
f.has_many :business_categories, :class=>'select_category', :heading=>'Services', :new_record=> true do |business_category|
business_category.input :service_ids, as: :check_boxes, collection: Service.all.map{|service| [service.name, service.id]}, :input_html => { :class => 'services_checkboxes'}
end
在快照中,如您所见 - 所有类别和服务复选框都来自类别和服务表,通过Category.all
和Service.all.
并且service_ids
应该是动态的,我的意思是我应该只看到那些基于步骤 2 中选择类别的服务,而不是全部。
我该如何实现它?
对于新记录(业务),您当前的表单很好,但对于编辑,您的表单应该是这样的:
form do |f|
f.inputs 'Business' do
f.input :name
Category.all.each |category| do
check_box_tag :category_ids, category.id, @business.categories.include?(category), :name => 'business[category_ids][]'
label_tag :category_ids, category.id
end
f.has_many :business_categories, :class=>'select_category', :heading=>'Services', :new_record=> true do |business_category|
Service.all.each |service| do
check_box_tag :service_ids, service.id, business_category.services.include?(service), :name => 'business[business_categories][service_ids][]'
label_tag :service_ids, service.id
end
end
end
参考: http://millarian.com/rails/quick-tip-has_many-through-checkboxes/