Witam,
mam ponizsza relacje miedzy modelami:
Report:
has_many :report_options
accepts_nested_attributes_for :report_options
ReportOption:
belongs_to :report
belongs_to :workbook
belongs_to :view
View:
has_many :report_options
has_many :reports, :through => :report_options
Workbook:
has_many :report_options
has_many :reports, :through => :report_options
Tabela report_options ma kolumny:
report_id
workbook_id
view_id
pdf: boolean
xls: boolean
png: boolean
Probuje utworzyc formularz ktory pozwoli mi na zapisywanie danych do tabeli report_options. W widoku formularza uzytkownik bedzie mial do wyboru dla kazdego dostepnego view oraz dostepnego workbook wybrac odpowiednie formaty za pomoca checkboxow:
PDF XLS PNG
view_1
workbook_1
view_2
workbook_2
view_3
workbook_3
…
Chcialbym teraz zapisac tego typu wartosci do tabeli report_options, jesli np uzytkownik wybral workbook_3 (PDF i XLS) oraz view_1 (PNG)
Jak najlepiej podejsc do takiego problemu?
Utworzylem helper ktory buduje mi hierarchie workboo oraz view z checkboxami PDF, XLS, PNG:
def dashboard_table(report_option, user_id)
@level_1 = 1
@level_2 = 0
@level_3 = 0
@level_4 = 0
accounts = Account.where(user_id: user_id)
concat(content_tag(:div, class: "table-responsive",
style: "overflow: hidden; outline: none;",
tabindex: "4") do
concat(content_tag(:table, class: "table table-hover tree") do
concat(content_tag(:thead) do
concat(content_tag(:tr) do
concat(content_tag(:th))
%w(PDF XLS PNG TWB Open).each do |format|
concat(content_tag(:th) do
format
end)
end
end)
end)
concat(content_tag(:tbody) do
accounts.each do |account|
concat(content_tag(:tr, class: "treegrid-#{@level_1}") do
concat(content_tag(:td) do
account.name
end)
5.times do
concat(content_tag(:td))
end
end)
sites = Site.where(account_id: account.id)
@level_2 = @level_1 + 1
if sites.count >= 1
sites.each do |site|
concat(content_tag(:tr, class: "treegrid-#{@level_2} treegrid-parent-#{@level_1}") do
concat(content_tag(:td) do
site.site_name
end)
5.times do
concat(content_tag(:td))
end
end)
workbooks = Workbook.where(site_id: site.id)
@level_3 = @level_2 + 1
if workbooks.count >= 1
workbooks.each do |workbook|
concat(content_tag(:tr, class: "treegrid-#{@level_3} treegrid-parent-#{@level_2}") do
concat(content_tag(:td) do
workbook.workbook_name
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :pdf, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :xls, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :png, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :twb, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
end)
views = View.where(workbook_id: workbook.id)
@level_4 = @level_3 + 1
if views.count >= 1
views.each do |view|
concat(content_tag(:tr, class: "treegrid-#{@level_4} treegrid-parent-#{@level_3}") do
concat(content_tag(:td) do
view.view_name
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :pdf, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :xls, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :png, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
concat(content_tag(:td) do
concat(content_tag(:div, class: "checkbox m-0") do
concat(content_tag(:label) do
concat(report_option.check_box :twb, {}, true, false)
concat(content_tag(:i, class: "input-helper") do
end)
end)
end)
end)
end)
end
end
@level_3 = @level_4 + 1
end
end
@level_2 = @level_4 + 1
end
end
@level_1 = @level_4 + 1
end
end)
end)
end)
end
W formularzu Report _form.html.erb:
<%= f.fields_for :report_options do |report_option| %>
<% dashboard_table(report_option, current_user) %>
<% end %>
Niestety przy takim podejsciu zapisuje sie tylko jeden rekord do tabeli report_options bez informacji o kluczu view lub workbook. Znowu gdy w metodzie helpera przy listowaniu view lub workbook umieszczam fields_for tworza sie dla kazdego workbook lub view z osobna co powoduje zapisywanie do tabeli report_options zbednych pustych rekordow. Czy spotkal sie ktos z podobnym problemem?