Rails 3: вопрос о полиморфных ассоциациях - PullRequest
1 голос
/ 04 июня 2011

Я пытался переключить свою модель Orders на полиморфную ассоциацию с моими моделями Product и Service. Однако у меня есть несколько вопросов, на которые я не смог найти ответы, даже после просмотра RailsCast и чтения документации (поэтому эти предложения приветствуются, но мне нужен более конкретный ответ).

Вопрос:

  1. Является ли полиморфная ассоциация лучшей в этом случае? До этого я использовал модель Transaction, в которой было несколько belongs_to ассоциаций, и использовал пользовательскую родительскую функцию, чтобы определить, какая это была. Это работало нормально, но кто-то предположил, что полиморфная ассоциация может привести в порядок вещи.
  2. Я правильно настроил полиморфную ассоциацию и не смог автоматически заполнить поля transactable_id и transactable_type. Код ниже. Я обошел это стороной, вставив их вручную в форму, но если кто-нибудь знает, как это сделать, это было бы здорово!
  3. Как я могу получить доступ к элементам с полиморфными ассоциациями? Например, в моем объекте Cart (какие has_many транзакции и какие Transactions belongs_to) я больше не могу получить доступ к вещам, используя кодирование типа @cart.transactions.each do |t| ... @t.product.name.

Мои ассоциации моделей выглядят так:

class Order < ActiveRecord::Base
  belongs_to :orderable, :polymorphic => true
end

class Product < ActiveRecord::Base
  has_many :orders, :as => :orderable
end

Раньше мои формы выглядели так:

<% form_for [@orderable, @order] do |f| %>
  ...
<% end %>

И были отображены так в моем Product Показать представление:

<%= render 'orders/form' %>

Теперь я передаю переменную для product.id в частичную визуализацию и использую ее для заполнения поля transactable_id. Но я чувствую, что это очень грязно.

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

1 Ответ

0 голосов
/ 04 июня 2011

Ответы на ваши вопросы:

  1. Если логин вашей компании подразумевает, что несколько моделей будут иметь связанную модель с одинаковыми полями, поэтому вам следует использовать полиморфную ассоциацию.(В вашем случае вы можете использовать его.)
  2. Если установить полиморфную ассоциацию, Rails автоматически обработает поля настройки *_id и *_type в зависимости от связанной родительской модели.
  3. Позволяетскажем, у вас есть Product со многими заказами в полиморфной ассоциации, и вы хотите определить, к какому модельному заказу относится:

    order = Order.first
    order.orderable
    
...