Ask A Question

Notifications

You’re not receiving notifications from this thread.

Controller loop for has_many_through associations

Siddharth Arun asked in Rails

I have the current models setup in my Rails app:

Recipe
has_many :items, :through => :item_linkers
has_many :item_linkers, inverse_of: :recipe

ItemLinker
belongs_to: recipe, inverse_of: :item_linkers
belongs_to: item, inverse_of: :item_linkers

Item
has_many :recipes, through: :item_linkers
has_many :item_linkers, inverse_of: :item

In my show page I currently display all recipes that use a particular ingredient like this:

<% @item.item_linkers.each do |item_linker| %>
    <% item_linker.recipe.name %>
<% end %>

This is not the most elegant way imo and would like to do something like this in the controller:

@recipes = @item.recipes

Followed by this in the show page:

<% @recipes.each do |recipe| %>
    <% recipe.name %>
<% end %>

But that doesn't seem to work. I get the following error. Any solutions on achieving this?

Cannot have a has_many :through association 'Item#recipes' which goes through 'Item#item_linkers' before the through association is defined.
Reply

Can you try changing the order of your has_many?

Like this:

has_many :item_linkers, inverse_of: :item
has_many :recipes, through: :item_linkers

Instead of:

has_many :items, :through => :item_linkers
has_many :item_linkers, inverse_of: :recipe

References:
https://github.com/rails/rails/issues/29123
https://stackoverflow.com/questions/44013983/activerecordhasmanythroughordererror

Let me know if that helps :)

Reply
Join the discussion
Create an account Log in

Want to stay up-to-date with Ruby on Rails?

Join 82,329+ developers who get early access to new tutorials, screencasts, articles, and more.

    We care about the protection of your data. Read our Privacy Policy.