Сохраните ссылку has_and_belongs_to_many в базовом приложении RoR - PullRequest
0 голосов
/ 21 июня 2011

Я пытаюсь узнать отношение has_and_belongs_to_many между моими 2 новыми и простыми моделями Продукт и Автор, где у Продукта может быть много авторов и у автора может быть много продуктов.

Я написал это:

class Author < ActiveRecord::Base
  has_and_belongs_to_many :products
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :authors
end

В частичной форме просмотра продуктов у меня есть:

<p>Products</p>
<%= collection_select(:product, :author_ids, @authors, :id, :name, :prompt => " ",  :multiple => true) %>

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

NoMethodError в ProductsController # обновить неопределенный метод `reject 'для« 1 »: строка

Rails.root: / home / stephane / www / HABTM Трассировка приложения |Framework Trace |Full Trace app / controllers / products_controller.rb: 63: in block in update' app/controllers/products_controller.rb:62:in update 'Request

Параметры: {"utf8" => "✓ "," _method "=>" put "," authenticity_token "=> "2GlTssOFjTVZ9BikrIFgx22cdTOIJuAB70liYhhLf + 4 =", "product" => {"title" => "Le tréor des des Templiers", "original_title" => "", "number" => "1", "Added_by" => "", "author_ids" => "1"}, "commit" => "Обновить продукт", "id" => "1"}

Что не так?Есть ли проблема с: product_ids ... Я видел в интернете, что мне нужно набрать "s", но я не уверен в том, что он представляет ....

Как я могу связать таблицу авторы_продуктов сключ, который возвращается из выпадающего меню?(здесь "author_ids" => "1") Thx!

Дополнительная информация: Может быть решена с этой информацией, но без сохранения отношения:

collection_select("sales_agent", "customer_id", @customers, "id", "name")

Предполагается, что у вас былмодель клиента с атрибутом ID и атрибутом имени, это приведет к точно такому же коду.Итак, глядя на значения, которые мы передаем в вызов collection_select:

  • Первый параметр - это модель, которая содержит один элемент из коллекции (например, sales_agent)
  • Далее следует имя поляв модели, которая ссылается на элемент коллекции, который он содержит (например, customer_id)
  • Next - это переменная, содержащая коллекцию элементов, которые мы хотим перечислить (например, @customers)
  • Next isатрибут значения тега опции (например, идентификатор клиента)
  • Далее следует атрибут отображения тега опции (например, имя клиента)

Итак, я сейчас написал

<p>Products</p>
<%= collection_select(:author, :author_id, @authors, :id, :name, :prompt => " ",  :multiple => true) %>

и все заработало, но без сохранения ссылки, на данный момент ... (сохраняется только обновление нормальных полей, а не отношения :-(

1 Ответ

2 голосов
/ 22 июня 2011

У вас есть отдельная модель с именем author_products для отношения HABTM?

Вам нужно будет выполнить другую миграцию, выполнив что-то вроде rails g model author_product, и таблица должна содержать только два поля:

belongs_to :author
belongs_to :product

Убедитесь, что первичного ключа нет.

Что-то вроде:

  def self.up
    create_table(:author_products), :id => false do |t|
       t.references :author
       t.references :product
    end
  end
...