Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby on Rails collection_select complexity

i have the following Problem, i Have the following in my customer bill view

<%= f.collection_select :product_id,Product.all,:id,:name %>

This is getting list of all the products from "Product" model and giving option to select from it. But i want to select the list of products from the "StoreOpeningStock" model.

I have these in my model

class Product< ActiveRecord::Base
has_many :store_opening_stocks
has_many :customer_bills
attr_accessible :name
end


class StoreOpeningStock < ActiveRecord::Base
attr_accessible :product_id
belongs_to :product 
end


class CustomerBill < ActiveRecord::Base
attr_accessible :product_id
 belongs_to :product
accepts_nested_attributes_for :store_opening_stock
end

Can anyone guide me how i can get product name and id from store_opening_stock??? Should i use Helpers??? or is there any other way?? Thanks in advance

I tried using helpers

def getting_prod_names
        @sto = StoreOpeningStock.all

          for x in @sto
        [
            ['{x.product.title}', '{x.product_id}']
        ]
    end
    end

getting following output

<%= f.select :product_id, options_for_select(getting_prod_names) %>

enter image description here

ANy Help?? :)

like image 871
bharath Avatar asked Feb 20 '23 02:02

bharath


2 Answers

When you create a form the data used to ccreate a collection_select isnt limited to the Class your going to create an object for. You could simply do the following:

<%= f.collection_select :product_id,StoreOpeningStock.all,:product_id ,:name %>

This should to it for you,...

add this to your StoreOpeningStock class:

def name
    return self.product.name unless self.product.nil?
    ""
end
like image 158
davidb Avatar answered Mar 02 '23 01:03

davidb


You need to clarify the relationship between your models...

But just to give you an idea. You can define the collection of products you want to display in your controller, inside the action related to the view (where you are displaying the collection).

Controller:

@products= #here you should call all products you want

Then, your collection of products can be displayed like:

<%= f.collection_select :product_id, @products,:id,:name %>

EDIT

You need to revise the relationship between your models. A product has many customer_bills, but are you sure that each customer_bill belongs to a single product?
I think you have a many-to-many relationship, as a customer_bill can also have many products.
If I understand it right, the solution is to create a ProductLine model between this many-to-many relationship.

Also, what is the difference between Product and StoreOpeningStock? What attributes have you included in the StoreOpeningStock?
If you have created this model only to show the availability of products, why don't you add an attribute in the Product model, for example a boolean column called availability.

like image 43
gabrielhilal Avatar answered Mar 02 '23 01:03

gabrielhilal