Как передать идентификатор объекта? - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть отношения между двумя моделями

Категория Модель

class Category < ActiveRecord::Base
   belongs_to :product
end

Модель продукта

class Product < ActiveRecord::Base
  has_many :categories
end

У меня есть category_id в таблице продуктов, но при созданииновый продукт в моей таблице продуктов category_id пуст.Я новичок в рельсах, кто-нибудь может помочь, пожалуйста?

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011

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

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

Для ясности, если она вам понадобится, product_id будет установлен только для категории .В конце концов, категория принадлежит этому продукту, поэтому она должна содержать идентификатор своего владельца.

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

# in your view, where you link from products/show.html.erb to category/new.html.erb
<%= link_to "Build new category for this product", new_category_url(:id => @product.id) %>
    # you must have @product defined, and you also must have 
    # 'resources :categories' in your routes file

# in your controller action categories/new, set the new category's product id:
def new
  @category = Category.new(:product_id => params[:id])
end

# include a hidden field to contain the product_id in your new form
<%= form_for @category do |f| %>
  <%= f.hidden_field :product_id %>
  ... other fields, labels, etc.
<% end %>

# save the record as you normally would (analogous to the code in your comment to @Chowlett).
@category = Category.new(params[:category])
if @category.save
  redirect_to :action => "list", :notice => "Category saved successfully."
else
  render :action => "new"
end

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

Если выхочу создать продукт и некоторые категории одновременно , это немного сложнее.Для получения дополнительной информации об этом посмотрите http://railscasts.com/episodes/196-nested-model-form-part-1 (это первый из трех частей) и https://github.com/ryanb/nested_form.. Я не предлагаю этот курс действий, если вы не очень хорошо свышеуказанные основы.Однажды я увлекся этим кодом в течение недели, когда был новичком в Rails!

3 голосов
/ 19 апреля 2011

Во-первых, у вас есть поле _id в неправильной таблице. Если Category belongs_to :product, то вашей таблице категорий нужно поле product_id.

Посмотрите на это следующим образом: каждый Продукт может иметь много категорий - так какое значение single можно ожидать в поле category_id?

Если у вас все еще есть проблемы после исправления, сообщите мне.

Редактировать: После того, как вы настроили свои таблицы, вам все равно нужно сообщить Rails, какой должна быть ссылка. У вас есть несколько вариантов. Предполагая, что у вас есть категория в руке, ваш лучший выбор - new_prod = my_cat.create_product(). В качестве альтернативы вы можете использовать new_prod = Product.create(:category => my_cat).

Позже вы можете связать модели вместе следующим образом:

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