I have an Ingredient which has a Measurement.
class Ingredient < ActiveRecord::Base
has_one :measurement
belongs_to :recipe
accepts_nested_attributes_for :measurement
end
class Measurement < ActiveRecord::Base
belongs_to :ingredient
end
The schemas appear right:
create_table “ingredients”, :force => true do |t|
t.integer “measurement_id”
t.integer “recipe_id”
t.string “quantity”
t.string “food”
t.datetime “created_at”
t.datetime “updated_at”
end
create_table “measurements”, :force => true do |t|
t.string “size”
t.float “quantity”
t.string “abbreviation”
t.string “measurement”
t.string “measurement_type”
t.string “equivalent”
t.datetime “created_at”
t.datetime “updated_at”
end
But I’m still getting this error preventing me from doing an
ingredient.measurement.abbreviation, but ingredient.measurement_id
works:
ActiveRecord::StatementInvalid in Recipes#show
Showing /Users/mkidd/Sites/cookbook/app/views/recipes/show.html.erb
where line #14 raised:
SQLite3::SQLException: no such column: measurements.ingredient_id:
SELECT “measurements”.* FROM “measurements” WHERE
(“measurements”.ingredient_id = 1) LIMIT 1
Extracted source (around line #14):
11: <% for ingredient in @recipe.ingredients%>
12:
13: <%= ingredient.quantity %>
14: <%= ingredient.measurement %>
15: <%= ingredient.food %>
16:
17: <% end %>
On 25 March 2011 20:24, R. K. [email protected] wrote:
belongs_to :ingredient
t.datetime “created_at”
t.string “equivalent”
t.datetime “created_at”
t.datetime “updated_at”
end
It is the belongs_to object that should have the foreign key, so
measurement should have an ingredient_id, not vice versa. Or the
relationship should be the other way round.
Colin
Colin L. wrote in post #989292:
On 25 March 2011 20:24, R. K. [email protected] wrote:
belongs_to :ingredient
t.datetime “created_at”
t.string “equivalent”
t.datetime “created_at”
t.datetime “updated_at”
end
It is the belongs_to object that should have the foreign key, so
measurement should have an ingredient_id, not vice versa. Or the
relationship should be the other way round.
Colin
I agree which is what is happening in the recipe object I set up.
Should I be using has_and_belongs_to_many instead since since one
measurement could belong to many different ingredients i.e. a cup of
flour will be used in more than one recipe so that ingredient will be
listed more than once?
On 25 March 2011 22:01, R. K. [email protected] wrote:
measurement should have an ingredient_id, not vice versa. Or the
relationship should be the other way round.
Colin
I agree which is what is happening in the recipe object I set up.
Should I be using has_and_belongs_to_many instead since since one
measurement could belong to many different ingredients i.e. a cup of
flour will be used in more than one recipe so that ingredient will be
listed more than once?
You could have an ingredient_measures table that belongs_to a recipe
(recipe has_many ingredient_measures). Each ingredient_measures
record specifies an ingredient and a measure of that ingredient for
the recipe. So you would also need ingredient_measure belongs_to
ingredient and belongs_to measure and ingredient and both ingredient
and measure has_many ingredient_measures.
So for a recipe, @recipe, then @recipe.ingredient_measures will give
all the ingredients with their measures.
In effect this is a HABTM relationship between ingredient and recipe
through ingredient_measures, but there is probably no need to specify
it like that unless you need to iterate all ingredients for a
particular measure or vice versa, which I guess you probably don’t
need.
Colin