Ассоциация has_one должна иметь только одну ассоциацию - PullRequest
4 голосов
/ 12 декабря 2011

У меня есть модель "Пользователь и галерея" и следующие ассоциации:

gallery.rb

attr_accessible :name, :description

belongs_to :user

user.rb

has_one :gallery 

Галерея созданачерез форму, и это не основано на создании пользователя (я делаю это, потому что некоторый пользователь не может создать галерею)

Вот контроллер галереи с действием create:

galleries_controller.rb

def create
  @gallery = Gallery.new(params[:gallery])
  @gallery.user_id = current_user.id # save user_id to gallery
  if @gallery.save
    redirect_to @gallery, :notice => "Your gallery has been successfully created."
  else
    render :action => 'new'
  end
end

1.) Мой первый вопрос:

, когда я настраиваю связь 1-к-1, такую ​​как эта, пользовательможет создать столько галерей, сколько захочет.Так разве это не имеет «только» одну ассоциацию?(Я не думаю, что я понимаю концепцию этого. Почему не возникает ошибка?)

2.) Мой второй вопрос:

Для того, чтобы иметьтолько одна галерея на пользователя У меня была проверка user_id в модели галереи

validates :user_id, :uniqueness => true

Это правильный способ избежать многих записей галереи, связанных с одним пользователем?

EDIT

Благодаря Рувиму, я делаю это так:

контроллер

def new
  if current_user.gallery == nil
    @gallery = current_user.build_gallery
  else
    flash[:error] = "You already have a gallery"
  end
end

def create
  @gallery = current_user.build_gallery(params[:gallery])
  if @gallery.save
    redirect_to @gallery, :notice => "Your gallery has been successfully created."
  else
    render :action => 'new'
  end
end

В представлении (new.html.erb)

<% if current_user.gallery == nil %>
  <%= form ... %>
<% end %>

Нет user_idнеобходимо подтверждение

Ответы [ 3 ]

5 голосов
/ 12 декабря 2011

Ваш первый вопрос: что действительно делает has_one, так это добавление предложения LIMIT 1 к соответствующему запросу sql и ничего более.Вот почему в вашем случае пользователь может создать столько галерей, сколько пожелает.

3 голосов
/ 12 декабря 2011

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

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

0 голосов
/ 07 марта 2016

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

add_index: галерея,: user_id, уникальный: true

...