The easiest solution I could find to this problem is to remove
accepts_nested_attributes_for from the Product model and in the
controller do:

@product = Product.new(params[:product])
@ingredient = find_or_initialise_by_name(params[:ingredient]

if @product.save && @ingredient.save
  redirect_to @product, :flash => 'Success'
else
  redirect_to :new
end

What do you think guys, do you have a better solution ?

Wael Nasreddine wrote in post #1000565:
> Hello,
>
> I'm a web developer comping from Zend Framework and I'm trying to learn
> Rails the right way and avoid Bad Practice from the start.
>
> I have a few questions in my head that I'm unable to get answered on my
> own, so I'm going to try and get it explained with an example.
>
> Let's say I'm building a site for a restaurant and the website have a
> Menu model (which is essentially categories, like Pizza, Burgers etc..),
> a Product model that belongs to the menu and an Ingredient model which
> belongs to Product, code:
>
> class Menu < ActiveRecord::Base
>   has_many :products
>
>   # … validations and other logic
> end
>
> class Product < ActiveRecord::Base
>   belongs_to :menu
>   has_many :ingredients
>
>   accepts_nested_attributes_for :ingredients
>
>   # … validations and other logic
> end
>
> class Ingredient < ActiveRecord::Base
>   belongs_to :product
>
>   validates :name, :presence => true, :unique => true
>
>   # … other validations and other logic.
> end
>
> So far so good, however now I'm stuck because I'm not sure how to code
> what I have in mind without ending up with a spaghetti code. In the new
> product form, I would like the user to be able to add ingredients (
> accepts_nested_attributes_for already there so I should be good for
> having the fields in the form ) but when the form has been filled and
> submitted, I want to create an ingredient if and only if it does not
> already exists, if on the other hand, it does, in this case the
> association should happen on the one that already exists, for example:
>
> Let's say that I already have :onion in the ingredients table, if I
> added a new product that has onion, I should not have two rows for the
> :onion ingredient (should not happen since I added a validation), but
> instead the association should happen on the one that already exists..
>
> How can I accomplish that? Should I be using a before_create hook? What
> should I do in that hook? or should I create a custom create method?
>
> Thank you.
>
> Wael

-- 
Posted via http://www.ruby-forum.com/.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to