Ruby — эквивалентный объект для Datatable?

#ruby

#ruby

Вопрос:

В c # есть объект DataTable, который представляет собой приятную структуру данных. В Ruby я не могу придумать подобный объект, даже хэш с подмассивами / хэшами, подобными этому:

 hash = { val: [] }
  

Я хочу иметь возможность создавать новый объект DataTable и добавлять к нему столбцы и строки. Есть идеи?

Комментарии:

1. Вместо того, чтобы говорить, какую структуру вы хотите, может быть, покажите нам исходную проблему, и кто-нибудь сможет продемонстрировать удобный способ ее решения с использованием Ruby. Это может быть случай XY

2. В Ruby мы просто создаем классы со attr_accessor свойствами.

Ответ №1:

Почему бы не создать класс с желаемой структурой в вашем уме и методами для добавления строк и столбцов и т.д.

Пример (только для базовой демонстрации):

 class DataTable
  attr_accessor :columns, :rows, :table

  def initialize()
    self.columns = []
    self.rows = []
  end

  def add_column(column_name)
    self.columns.push(column_name)
  end

  def add_row(row = {})
    self.rows.push(row)
  end
end

# Create a new datatable
datatable1 = DataTable.new

datatable1.add_column('id')
datatable1.add_row([1])

puts datatable1.columns # ['id']
puts datatable1.rows[0] # [1]
  

Вы можете решить, как структурировать ваши данные, и иметь больше методов, которые помогут вам достичь того, чего вы хотели бы достичь.

Ответ №2:

Наблюдайте за DataTable объектом в c# и что происходит

 DataTable dt = new DataTable();
dt.Columns.Add("some_column");
dt.Rows.Add("some_row")
  

В ruby classes есть чертежи для, objects поэтому нужно будет создать пользовательский classes . В приведенном выше примере вы можете увидеть три classes : DataTable Columns и Rows

Репликация в Ruby

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

 class DataTable
  attr_reader :rows, :columns, :row

  def initialize(table_name)
    @rows = []
    @columns = [ DataColumn.new("id") ]
    @primary_key = 0
    @selected_row = nil
  end

  def add_row
    @rows << DataRow.new(@columns, @primary_key)
    @primary_key  = 1
  end

  def add_column(column_name)
    @columns << DataColumn.new(column_name)
    @rows.map { |row| row.add_column(column_name) }
  end

  def select_row(id)
    @rows.map(amp;:values).map { |row| row["id"].to_s == id.to_s ? @row = row : nil }
    @row
  end

  alias_method :[], :select_row

  def update_row(col, val)
    return unless @rows.keys.include? col
    
    @row[col] = val
  end
end

class DataColumn
  attr_accessor :column_name

  def initialize(column_name)
    @column_name = column_name
  end
end

class DataRow
  attr_accessor :values

  def initialize(columns, primary_key)
    @values = columns.map(amp;:column_name).product([nil]).to_h
    @values["id"] = primary_key
  end

  def add_column(column)
    @values[column] = nil unless @values[column]
  end
end
  

затем вы делаете следующее:

  d = DataTable.new("table_1")
 d.add_row
 d.add_row
 d.add_column("col_1")
 d.add_column("col_2")
 d[0]["col_1"] = "some_val"