Есть ли более красноречивый способ создания таблицы с переменным числом столбцов: Active Record & Rails 3? - PullRequest
0 голосов
/ 24 октября 2010

В настоящее время у меня есть класс Order. Каждый заказ имеет от 1 до бесконечного количества товаров. количество предметов неизвестно до времени выполнения. Так как в активной записи / рельсах нет типа поля Array, как создать переменное число столбцов?

Единственный способ, о котором я могу подумать, - это заранее указать несколько столбцов заявок; но очень негибкий и неэффективный:

class CreateOrders < ActiveRecord::Migration
  def self.up
    t.integer :ticket_id, :ticket_id, :ticket_id, :ticket_id, :ticket_id
    t.decimal :total
    t.timestamps
  end

  def self.down
    drop_table :orders
  end
end

Ответы [ 3 ]

4 голосов
/ 24 октября 2010

Как правило, в 3-й нормальной форме таблицы базы данных не будет переменного числа столбцов.

То, что у вас есть, может быть 2 таблицами, одна для заказа, и у нее "много" позиций, поэтомуВ модели LineItem записи будут храниться в таблице line_items, где каждая запись имеет product_id и количество, а каждый LineItem «принадлежит» ордеру.(с указанием order_id или line_item.order со ссылкой на заказ, которому он принадлежит).

0 голосов
/ 24 октября 2010

Как уже было сказано, вы хотите смоделировать это как отношение own_to / has_many.

class CreateOrders < ActiveRecord::Migration
  def self.up
    t.decimal :total
    t.timestamps
  end

  def self.down
    drop_table :orders
  end
end

class CreateItems < ActiveRecord::Migration
  def self.up
    t.integer :ticket_id
    t.integer :order_id
    t.timestamps
  end

  def self.down
    drop_table :items
  end
end

class Order < ActiveRecord::Base
  has_many :items, :dependent => "destroy"
end

class Item < ActiveRecord::Base
  belongs_to :order
end

Order.all.each do |order|
  puts "Order " + order + " has items :"
  order.items.each { |item| puts "  " + item }
end
0 голосов
/ 24 октября 2010

Вы должны использовать другую таблицу с именем items, которая будет иметь столбец order_id . Поэтому многие элементы могут быть связаны с одним заказом. Другими словами, в заказе может быть много предметов.

Прочтите статью , объясняющую порядок, в котором много счетов (в вашем случае элементы).

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