Skip to main content
Ask A Question
Notifications
You’re not receiving notifications from this thread.
Subscribe

Multiple select for CSV Export

Rails • Asked by Sascha M.

Hi there,

My users can create a report record which is basically a scaffolded model "Report" with controller and views. The users can use this model to create records that a CSV method is using to query 2 other models: Order (parent) model and the corresponding Sale (child).

The Report model contains these columns:

t.datetime "start" *(for createdat between (?) and (?))*
t.datetime "end" *(for createdat between (?) and (?))*
t.string   "brand" *(brand = ?)*
t.string   "team" *(team = ?)*

Short excerpt of the CSV query looks like that:

Order.where("created_at between (?) and (?) and brand = ? and team = ?", self.start, self.end, self.brand, self.team).each do |order| order.sales.each do |sale|

This basically outputs each single Sale record in one line. So when 1 Order contains 5 sales, then 5 rows are printed into the CSV file.
That works perfectly with a single brand and a single team.

Now I want to do offer my users multiple select of brands and teams. E.g. when the brand is "Adidas" and "Nike" and the corresponding teams are "US" and "Europe" I want to put both outputs into one CSV instead having the user to create 2 reports.

I'm really struggling with that. What do I need to adjust so that multiple values are getting saved into one record, like brand = "Adidas, Nike" and team = "US, Europe" and then have this array parsed and get that into the CSV AR Query.

Thanks a LOT in advance,
Sascha



I haven't done this personally but I have some very similar scenarios and I think that if I were doing it, I'd setup a form that has all the options for your user to select which submits their selections to a custom function that will take that input, run my queries, and generate an array or hash to then pass to the csv save function.


Perfect. Thank you for the hint. I've resolved it like this:

Form:

<%= f.select :brand, Brand.all.collect {|x| [x.company, x.company]}, {}, :multiple => true, :size => 8 %>

Controller:

params.require(:report).permit(:title, :start, :end, brand: [])

Model (to remove characters):

    before_save do
    self.brand.gsub!(/[\[\]\"]/, "") if attribute_present?("brand")
    self.brand.gsub!(/\A,|,\Z/, '') if attribute_present?("brand")
    self.brand.gsub!(/, /, ',') if attribute_present?("brand")
    self.brand.strip! if attribute_present?("brand")
    end

then

        brands = self.brand
        brands = brands.split(',')

to turn it into an array.

then loop through it, with:

brands.each do |b| ...

Login or Create An Account to join the conversation.

Subscribe to the newsletter

Join 31,353+ developers who get early access to new screencasts, articles, guides, updates, and more.

    By clicking this button, you agree to the GoRails Terms of Service and Privacy Policy.

    More of a social being? We're also on Twitter and YouTube.