has_many associations table confusing
My goal here is to print list of users from specified city and category with their names, address and club name.Name and address display correctly but when i add club name,says undefined method memberships for #<Enumerator:0xa5509b0>
.I know this is because Club is in different model ,So the question is how do i access club name?I am really shallo开发者_JAVA百科w in complex has_many realtionships.Can anybody make necesary corrections please,This is how far i got.Thank you in advance
MODELS
class User < ActiveRecord::Base
has_many :memberships
has_many : clubs,:through =>:memberships
belongs_to :category
belongs_to :city
end
class Club < ActiveRecord::Base
has_many :users
has_many :memberships
has_many : users ,:through =>:memberships
belongs_to :city
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :club
end
class City < ActiveRecord::Base
has_many :clubs
has_many :users
end
class Category < ActiveRecord::Base
has_many :users
end
CONTROLLER
@users=User.where("category_id =? AND city_id=?",Category.find(2),session[:city_id])
@user=@users.collect
@club=@user.memberships #this gives undefined method membership
VIEW
<% @user.each do |user| %>
<%= user.username %>
<%= user.address %>
<%= @club.name %> #attribute name is in the club model not membership
<%end%>
ROUTE
devise_for :users
resources :city,:club,:category
The line below returns an array instead of what you are expecting, i.e. User object.
@user=@users.collect
If users shown in the view belong to different clubs you should access them directly in the view. You can eager load the clubs if needed.
In your controller
@users=User.where(:category_id => Category.find(2), :city_id=>session[:city_id]).
include(:clubs)
In your view
<% @users.each do |user| %>
<%= user.username %>
<%= user.address %>
<% user.clubs.each do |club| %>
<%= club.name %>
<%end%>
<%end%>
First of all, you have an error in Club class. You cant have 2 relations with the same name. Second one will override first.
has_many : users ,:through =>:memberships
should be
has_many :members, :through =>:memberships, :foreign_key => 'user_id'
The search should be:
@users = User.where(:category_id => 2, :city_id => 3).include(:clubs)
Or whatever it values you want to search by.The view is:
<% @user.each do |user| %>
<%= user.username %>
<%= user.address %>
<%= user.club.name %> #attribute name is in the club model not membership
<%end%>
Your routes are fine.
精彩评论