Добавление нескольких таблиц в рельсы - PullRequest
4 голосов
/ 28 октября 2008

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

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

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

Я уверен, что есть простой способ сделать это на рельсах, но я не могу найти его.

Приветствия

Robin

Ответы [ 4 ]

6 голосов
/ 28 октября 2008

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

@author = Author.find_or_create_by_name(params[:author_name])
@book = Book.new(params[:book])
@book.author = @author
@book.save

Это найдет автора с таким именем или создаст его, а затем назначит этого автора созданной книге.

Примечание. Это также предполагает, что авторы могут быть однозначно идентифицированы по имени, что обычно не соответствует действительности. Например, там может быть несколько парней, которых называют «Стивен Кинг», и только один из них написал Сияющий

5 голосов
/ 28 октября 2008

Предлагаю посмотреть серию сложных форм Railscasts здесь .

1 голос
/ 31 октября 2008

комментарий Робинта к ответу Мики:

Это похоже на хороший способ сделать это - хотя я удивлен, что Rails не делает это немного более автоматически

Это четыре строки! Насколько автоматически Rails может сделать это? Это основа, а не человек. :)

И вот оно в двух:

@author = Author.find_or_create_by_name(params[:author_name])
@book = Book.create params[:book].merge({:author_id => @author.id})

И у ответа Хонзы есть много достоинств:

class Book < ActiveRecord::Base
  ...
  def author_name=(author_name)
    self.author = Author.find_or_create_by_name author_name
  end
end

В этом примере и при условии, что ваша форма имеет параметр типа "book [author_name]", ваш код просто:

@book = Book.create params[:book]

Wowzers.

0 голосов
/ 04 ноября 2008

Это в конечном итоге будет автоматическим (согласно этому посту в Rails 2.2): http://ryandaigle.com/articles/2008/7/19/what-s-new-in-edge-rails-nested-models

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