Rails - отношения HABTM ... Хранение значений флажков от пользователей - PullRequest
0 голосов
/ 30 января 2010

Я пытаюсь выяснить эту проблему отношений HABTM, чтобы сохранить ее в интересах пользователей моей базы данных. Таблица интересов содержит список различных интересов с идентификатором и именем (т.е. id = 1, name = 'Music')

У меня есть модель пользователя => user.rb

has_and_belongs_to_many :interests

и модель интересов => Interest.rb

has_and_belongs_to_many :users

Теперь я пытаюсь редактировать или обновлять выбор интересов пользователей из списка флажков. Контроллер выглядит так =>

def edit
#@interests = Interest.find(:all)

  @title = "Edit Interest"
  @user = User.find(session[:user_id])
  @user.interest ||= Interest.new
  interest = @user.interest
  if param_posted?(:interest)
      if @user.interest.update_attributes(params[:interest])
          flash[:notice] = "Changes saved."
          redirect_to :controller => "users", :action => "index"
      end
  end
end

и функция param_posted выглядит следующим образом

  def param_posted?(sym)
  request.post? and params[sym]
  end

Логика представления выглядит следующим образом:

<% for interest in @interest %>
<div>
<%= check_box_tag "user[interest_id][]", interest.id, @user.interests.include (interest) %>
<%= interest.name %>
</div>
<% end %>

Я думал, что все выглядит кошерно, но когда я запускаю представление, я получаю ошибку:

NoMethodError в InterestController # edit - неопределенный метод "интереса" для # пользователя: 0x4797ddc

Нужно ли создавать отдельную модель / таблицу, которая связывает интерес пользователей к событиям? как InterestsofUsers (id, user_id, интереса_ид)? Я думал, что отношения HABTM устранят необходимость в этом ...

Confused

Ответы [ 2 ]

5 голосов
/ 30 января 2010

Есть пара вопросов. Во-первых, вам нужно создать объединительную таблицу для интересов и пользователей. Его название является комбинацией двух таблиц в алфавитном порядке. У него не должно быть первичного ключа. Вот пример:

class CreateInterestsUsersJoinTable < ActiveRecord::Migration
  self.up
    create_table :interests_users, :id => false do |t|
      t.integer :interest_id
      t.integer :user_id
    end
  end

  self.down
    drop_table :interests_users
  end
end

Называя объединяющую таблицу таким особым образом, Rails знает, как найти ее автоматически.

Также помните, что у пользователя нет одного интереса, у пользователя есть много . Вот почему нет @user.interest метода. Существует метод @user.interests, который возвращает массив всех интересов этого пользователя, который вы можете циклически проходить по мере необходимости.

Кроме того, я бы действительно сделал ваш контроллер более RESTful. Это действие редактирования пытается обработать как минимум 2 разных типа запросов: редактировать И обновлять, когда они должны быть отдельными.

После того, как вы исправите эту часть, опубликуйте еще один вопрос о том, как сделать ваш контроллер более спокойным, и я или кто-то другой может вам помочь. Для тех, кто ищет в базе данных stackoverflow в будущем, лучше держать эти две проблемы в отдельных вопросах.

ОБНОВЛЕНИЕ: вопросы о взаимоотношениях многие-ко-многим в Rails возникали достаточно часто, и я написал статью под названием базовые ассоциации многие-ко-многим , чтобы объяснить, как использовать habtm против has_many :through и различия между ними.

0 голосов
/ 30 января 2010
  1. присоединиться к столу - Interest_users
    1. пользователь имеет .... to_many, так что это множественное число, вам нужно сделать там список флажков
    2. попробуйте придерживаться RESTful соглашений :) сообщение должно идти, чтобы обновить метод
...