2

I'm trying to obtain a subset of records for a grouped_collection_select, in the schema I have a Brand and a Model, and we handle different lines of products, when we request a product, we specify the line that we are going to request, so, we can have the Brands, and the models of that line, so the models are defined as follows:

Model for Brand

class Brand < ActiveRecord::Base
  validates :brand_key, uniqueness: true, presence:true
  has_many :models
  accepts_nested_attributes_for :models, allow_destroy: true
end

Model for Modelx

class Modelx < ActiveRecord::Base
  belongs_to :brand
  belongs_to :line
  validates :model_key, uniqueness: true, presence:true
end

Model for Line

class Line < ActiveRecord::Base
  validates :line_key, uniqueness: true, presence:true, length: {in: 1..6}
  has_many :line_features, -> { order(:sort_order) }
  has_many :modelx
  accepts_nested_attributes_for :line_features, allow_destroy: true
end

Model for Product

class Product < ActiveRecord::Base
  belongs_to :vendor
  belongs_to :line
  belongs_to :brand
  belongs_to :modelx
  belongs_to :operating_status
  has_many :line_features, -> { order(:sort_order)}

  store_accessor :line_features
end

Controller for Product (new)

def new
  @brands=brand.where(id: Modelx.select(:brand_id).where(line_id: params[:line_id]))
  @modelxs=Modelx.where(line_id: params[:line_id])
  ...
end

excerpt from partial form

<%= f.collection_select( :brand_id, @brands, :id, :brand,{:prompt =>'Brands'}) %>
<%= f.grouped_collection_select(:modelx_id, @brands, :modelx, :brand, :id, :modelox) %>

Now, the problem that I'm facing is that when I display a model I need to present only the models available for that brand and line, but, the request is bringing all the models for the brand as it's supposed to be and I don't know how to discriminate those lines that are not needed.

Any help, hint or suggestion is highly appreciated.

Update to question

I don't know if this is a workaround or a solution to the question, but, it was the only way that I found to get to a solution for the requirement, for that reason I'm posting as an update instead of answering the question for whom it may help.

  1. Reviewed the documentation once again and find out that the method :modelx referred by <%= f.grouped_collection_select(:modelx_id, @brands, :modelx, :brand, :id, :modelox) %> was requesting all the models as noted in apidock, this method was the solution for the problem.

  2. Created a method in the brand model according to the subset depicted above, due to the fact that the grouping was made by brand, here the excerpt

Model for Brand (Excerpt)

  ...
  def modelx_ltvi
    Modelx.where("line_id = ? and brand_id =?",$line_id, self.id)
  end

Special Note: Due to my inexperience, I was not able to pass the value of the :line_id from the form, so, I put it in a global variable.

  1. Modified the form partial

Excerpt from partial form

 ...
<%  $line_id=@product.line_id %> 
 ...
<%= f.grouped_collection_select(:modelx_id,
      @brands, :modelx_ltvi, :brand, 
      :id, :modelx) %>
  <% end %>

And that makes the hamster run.

1 Answers1

0

Filter your models by the brands you just found, something like:

@brands=Brand.where(id: Modelx.select(:brand_id).where(line_id: params[:line_id]))
@modelxs=Modelx.where(line_id: params[:line_id], brand_id:  @brands.map(&:id))
@selected_model_names = @modelxs.map(&:name).sort.uniq
Michael Durrant
  • 93,410
  • 97
  • 333
  • 497
  • thanks for your kind advice, however, the problem that I'm facing is that the model selector for the grouped collection select is not filtering those fields that doesn't belong to the line, clearly, I'm not understanding something, I applied your suggestions, but, the behavior remains the same. – Moises Najar Apr 17 '16 at 15:15