Ассоциация Has_one должна иметь только одну ассоциацию.

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

галерея.rb

attr_accessible :name, :description

belongs_to :user

пользователь.rb

has_one :gallery 

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

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

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

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

РЕДАКТИРОВАТЬ

Благодаря Рубену, я сделал это так:

контроллер

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 не требуется


person benoitr    schedule 12.12.2011    source источник


Ответы (3)


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

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

person Reuben Mallaby    schedule 12.12.2011

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

person Marek Příhoda    schedule 12.12.2011

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

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

person Obromios    schedule 06.03.2016