я хочу, чтобы объект имел несколько расширяемых атрибутов? как этого добиться с помощью activerecord? - PullRequest
1 голос
/ 18 октября 2011

Мне нужен объект User, который имеет много атрибутов.Мне нужно иметь возможность динамически создавать и добавлять атрибуты, и они легко доступны обычным способом.

Каков наилучший способ добиться этого?

Для ясности - вот типвещь, которую я пытаюсь создать:

User.name = "Dave"
User.type = "Admin"
User.height = 12
User.weight = 2
User.favourite_beer = "IPA"

User.name = "Shelly"
User.type = "Admin"
User.height = 12
User.weight = 2
User.favourite_makeup = "Lipstick"

Это должно показать, что у Шелли был бы favourite_makeup, когда у Дэйва не было бы, потому что это не применимо.

Я знаю, что мог бы простоустановите для favourite_makeup значение null в таблице - но я не хочу в конечном итоге получить огромную неэффективную таблицу, поскольку может быть много десятков атрибутов.

Извинения за грубый пример.

Спасибо:)

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Возможно, вы захотите попробовать сериализовать

http://api.rubyonrails.org/classes/ActiveRecord/Base.html - Сохранение массивов, хэшей и других не отображаемых объектов в текстовых столбцах

class User < ActiveRecord::Base
    serialize :preferences, Hash
end

u = User.new
u.preferences[:favourite_beer] = "IPA"

Ваша таблица будет иметь текстовый столбец с именем предпочтения или избранное или что-то еще

0 голосов
/ 18 октября 2011

Вы хотите это для БД или для класса?

DB:
Создать таблицу для пользователей (ID, Имя и т. Д.)
Создать таблицу для определения атрибутов (ID, атрибут, Тип)
Создать таблицу для связи пользователей с атрибутами (UserID, AttributeID, Value)

Пример:

Пользователь

1 | Пользователь1
2 | Пользователь2

Атрибуты

1 | Атрибут1 | Строка
2 | Атрибут2 | Строка
3 | Атрибут3 | Int

UserAttributes

1 | 1 | Value1
1 | 2 | Value2
2 | 2 | Value3
2 | 3 | Значение4

Объяснение:

  • Пользователь1 имеет атрибут1 со значением1
  • Пользователь1 имеет Атрибут2 со значением2
  • Пользователь2 имеет Атрибут2 со значением3
  • У пользователя 2 есть атрибут 3 со значением 4

Класс: Это просто идея

Public Class User
    Private ReadOnly innerList As Dictionary(Of String, Object)

    Public Default Property Item(index As String) As Object
        Get
            If innerList.ContainsKey(index) Then
                Return innerList(index)
            End If
            Throw New IndexOutOfRangeException
        End Get
        Set(value As String)
            If innerList.ContainsKey(index) Then
               innerList(index)=value
            Else
                innerList.Add(index,value)
            End If
        End Set
    End Property

    Public sub Add(index As String,value As Object) 
        If innerList.ContainsKey(index) Then
            innerList(index)=value
        Else
            innerList.Add(index,value)
        End If
    End Sub

    Public Sub test
        Dim u1 As new User
        Dim u2 As New User
        u1.Add("attribute1","value1")
        u1.Add("attribute2","value2")
        u2.Add("attribute2","value3")
        u2.Add("attribute3","value4")
        Dim att1 As String=u1("attribute1").ToString
        Dim att3 As String=u2.Item("attribute3").ToString
    End Sub

End Class

Надеюсь, это поможет вам.

0 голосов
/ 18 октября 2011

Я не уверен в настройке модели, но для настройки БД я бы сделал что-то вроде этого:

class CreateEntities < ActiveRecord::Migration
  def self.up
    create_table :entities do |t|
      t.text :entity

      t.timestamps
    end
  end

  def self.down
    drop_table :entities
  end
end

class CreateAttributes < ActiveRecord::Migration
  def self.up
    create_table :attributes do |t|
      t.integer :entity_id
      t.integer :user_id
      t.text :value

      t.timestamps
    end
  end

  def self.down
    drop_table :attributes
  end
end

Идея состоит в том, что "favourite_beer" и "favourite_makeup" будут сущностями, а затемАтрибуты - это место, где вы можете связать сущность и пользователя, а затем сохранить значение.Это позволяет вам иметь много ко многим вокруг.

Отсюда вы, вероятно, захотите сделать USER

has_many :attributes
has_many :entities, :through => attributes

Entity

has_many :attributes

Атрибут

has_many :entities
has_many :users

Я не уверен на 100% в моделях и т. Д., Но этого должно быть достаточно, чтобы вы начали или кто-то другой пришел и заполнил пробелы.

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