таблица ассоциаций has_many сбивает с толку - PullRequest
0 голосов
/ 15 октября 2011

Моя цель здесь - напечатать список пользователей из указанного города и категории с их именами, адресом и названием клуба. Имя и адрес отображаются правильно, но когда я добавляю название клуба, появляется сообщение undefined method memberships for #<Enumerator:0xa5509b0>. Я знаю, что это потому, что клуб в другой модели, так что вопрос в том, как я могу получить доступ к названию клуба? Я действительно мелкий в сложных has_many realtionships. Может кто-нибудь сделать необходимые исправления, пожалуйста, это, как далеко я получил. Спасибо заранее

МОДЕЛЬ

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

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Строка ниже возвращает массив вместо того, что вы ожидаете, т.е. объект пользователя.

@user=@users.collect

Если пользователи, показанные в представлении, принадлежат к разным клубам, вы должны обращаться к ним непосредственно в представлении.При желании вы можете загружать булавы.

В вашем контроллере

@users=User.where(:category_id => Category.find(2), :city_id=>session[:city_id]).
  include(:clubs)

На ваш взгляд

<% @users.each do |user| %>
  <%= user.username %>
  <%= user.address %>
  <% user.clubs.each do |club| %>
    <%= club.name %>
  <%end%>  
<%end%>
0 голосов
/ 15 октября 2011

Прежде всего, у вас есть ошибка в клубном классе. Вы не можете иметь 2 отношения с одним и тем же именем. Второй заменит первый.

has_many : users ,:through =>:memberships

должно быть

has_many :members, :through =>:memberships, :foreign_key => 'user_id'

Поиск должен быть:

@users = User.where(:category_id => 2, :city_id => 3).include(:clubs)

Или по любым значениям, по которым вы хотите выполнить поиск. Представление:

<% @user.each do |user| %>
  <%= user.username %>
  <%= user.address %>
  <%= user.club.name %> #attribute name is in the club model not membership
<%end%>

Ваши маршруты в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...