Лучшая практика Rails для создания модели при создании отдельной модели - PullRequest
1 голос
/ 07 декабря 2011

Итак, у меня есть две модели: User и Group.

User belongs_to :group

и

Group has_many :users.

При создании нового User я хочу проверить уже созданный Group и назначить его или создать новый Group на основе предоставленной пользователем информации.Group.find_or_create_by_name("Name") кажется отличным способом сделать это, но мой вопрос, где это должно быть расположено?Я предполагаю, что после "Fat Models, тощие контроллеры" это должно быть в user.rb.Если это в модели, каков наилучший способ передачи пользовательских строк при создании пользователя?Должен ли я установить метод в user.rb, а затем вызвать этот метод в users_controller.rb?

И я предполагаю связанный с этим вопрос: я знаю, что моя схема должна отражать

create_table "users" do |t|
  t.integer "group_id"

дляцель запроса.Как именно Rails "автоматически" связывает их?При создании моей Group модели, я предполагаю, что ей нужен столбец string:id, а Rails просто связывает их?

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

1 Ответ

1 голос
/ 07 декабря 2011

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

Обычно группа может иметь несколько членов иПользователь может быть членом нескольких групп.Для этого вы создаете модель ассоциации под названием membership.

Итак, ваша пользовательская модель имеет:

has_many :memberships
has_many :groups, :through => :memberships

А ваша групповая модель имеет:

has_many :memberships
has_many :members, :through => memberships

Ассоциация будет иметь собственную таблицу, которая будет выглядеть примерно так:

create_table "memberships" do |t|
    t.integer "group_id"
    t.integer "user_id"
    t.timestamps
end

add_index :memberships, :group_id
add_index :memberships, :user_id

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

after_create :create_group

def create_group
   # whatever logic and create group
end

Для получения дополнительной информации об обратных вызовах активной записи см. http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

Если группа, к которой вы создаете, относитсяинформация вводится в форму (представление) и не имеет прямого отношения к пользователю, тогда вам придется заняться созданием группы в контроллере.Что-то вроде:

def create
   @group = Group.build(params[:group])
   @group.save!
   @user = User.build(params[:user])
   @user.group_id = @group.id
   @user.save!
end

Или более чистым способом:

def create
   @group = Group.build(params[:group])
   @group.save!
   @user = @group.users.build(params[:user])
   @user.save!
end
...