Передовой опыт: как разделить ассоциации-функции в контроллерах с моделями равного доступа - PullRequest
1 голос
/ 15 июля 2009

У меня есть 2 модели с равным доступом: пользователи и категории

Каждый из них должен иметь стандартные действия: индексировать, создавать новые, создавать, редактировать, обновлять и уничтожать

Но где мне интегрировать ассоциации, когда я хочу создать ассоциацию между этими двумя моделями?

Должен ли я писать 2 раза почти один и тот же код:

class UsersController << ApplicationController

  # blabla
  def addCategory
    User.find(params[:id]).categories << Category.find(params[:user_id])
  end
end

class CategoriessController << ApplicationController
  # blabla
  def addUser
    Category.find(params[:id]).users << User.find(params[:user_id])
  end
end

Или я должен создать новый контроллер с именем UsersCategoriesController?

Какая лучшая практика здесь? Вышеприведенный пример выглядит не очень СУХОЕ .... А новый контроллер, я думаю, слишком много?

Спасибо!

EDIT:

Мне нужно иметь обе эти функции добавления ассоциаций, потому что, например,

#on the 
show_category_path(1)
# I want to see all assigned users (with possibility to assign new users)

и

#on the 
show_user_path(1)
#I want to see all assigned categories (with possibility to assign new categories)

EDIT:

У меня отношения по поводу HBTM.

Ответы [ 2 ]

0 голосов
/ 15 июля 2009

Если у вас возникла ситуация, когда вам нужно сделать это с has_and_belongs_to_many, вы можете воспользоваться подходом, который вы используете в настоящее время, или встроить его в существующие действия по обновлению.

Когда вы добавите отношение habtm, вы получите дополнительный метод для ваших классов ...

class User < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

С этим вы можете сделать следующее:

user = User.find(params[:id])
user.category_ids = [1,3,4,7,10]
user.save

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

Если вам нужно добавлять их по одному, то методы, которые вы создали в исходном посте, достаточно разумны. Если вы считаете, что повторение имеет запах кода, вы правы - вот почему вы должны использовать подход, который я обрисовал в предыдущем ответе, - дополнительную модель и дополнительный контроллер.

0 голосов
/ 15 июля 2009

Вы не упомянули, используете ли вы has_and_belongs_to_many или has_many: through. Я рекомендую has_many: through, который заставляет вас использовать фактическую модель для объединения, что-то вроде UserCategory или Категоризация, что-то вроде этого. Затем вы просто создаете новый контроллер для обработки этого.

Вы хотите передать пользователя и категорию в качестве параметров действию create этого контроллера.

Ваша форма ... <% form_tag categoryorizations_path (: category_id => @ category.id),: method =>: post do%> <% = text_field_tag ​​"user_id"%> <% = submit_tag "Добавить пользователя"%> <% end%>

Ваш контроллер ...

class CategorizationsController < ApplicationController
   def create
     if Categorization.add_user_to_category(params[:user_id], params[:category_id])
        ...

   end
end

тогда ваш класс классификации ...

class Categorization
   belongs_to :user
   belongs_to :category

   def self.add_user_to_category(user_id, category_id)
     # might want to validate that this user and category exist somehow
     Categorization.new(:user_id => user_id, :category_id => category_id)
     Categorization.save
   end
end

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

Надеюсь, это поможет.

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