2012-11-06 11 views
5

Zwykle do tworzenia/modyfikacji tabeli w bazie danych używam migracji (uruchamiam ręcznie rake db:migrate), a następnie w moim kodzie używam ActiveRecord. Jest to bardzo fajne, ponieważ nie muszę się martwić o reprezentację danych w db oraz o specyficzny rodzaj db (sqlserver, pg lub inny).szyny tworzą tabelę w db dynamicznie

Ale teraz klient chce mieć możliwość samodzielnego tworzenia "rzeczy" w locie, np. Zaczyna sprzedawać komputery, więc chce interfejsu, w którym może dynamicznie tworzyć obiekt "komputerowy" o właściwościach takich jak " Nazwa, RAM, HD, ... ". Wydaje się całkiem naturalne utworzenie oddzielnej tabeli w db ze wszystkimi tymi polami. Ale jak mogę to zrobić w RoR i zachować wszystkie te fajne rzeczy na temat ActiveRecord?

Proszę sugerować.

Odpowiedz

2

Zwykłym sposobem jest zrobić dokładnie odwrotnie:

  • mieć tabeli dla typów obiektów
  • mieć tablicę nazw pól dla każdego typu obiektu
  • Mają bardzo duży stół z wszystkich niestandardowe atrybuty dla każdego obiektu dowolnego typu:

Nazywa się to EAV (model wartości atrybutu jednostki, patrz http://en.wikipedia.org/wiki/Entity-attribute-value_model). I skaluje się całkiem źle.

Alternatywnie można użyć kolumny tekstowej store zamiast dużej tabeli EAV (patrz http://api.rubyonrails.org/classes/ActiveRecord/Store.html), aby nie trzeba było wykonywać trudnych wyszukiwań atrybutów, typowych dla EAV. Nadal musisz przechowywać gdzieś definicje "typów obiektów", więc oczekiwane pola itp. Są dostępne podczas budowania formularzy i tabel.

Problem z tym podejściem polega na tym, że nie można wysyłać zapytań (gdzie/dołączyć/wybrać) do tych atrybutów, ponieważ nie są one kolumnami. Istnieje szereg rozwiązań, które:

  • Nie rób filtrowanie na tych atrybutów (Meh ...)
  • Masz zewnętrznego serwera wyszukiwania, który jest w stanie zrobić obliczach wyszukiwanie
  • (jak @Amar poprawnie mówi) Użyj bazy danych dokumentów
  • Użyj postgreSQL i użyj hstore zamiast prostej kolumny z numerem seryjnym.
+0

uzgodniono z @rewritten, a jeśli chcesz więcej przykładów spójrz na "lokomotywa CMS" (http://locomotivecms.com/), robią prawie to samo, co próbujesz zrobić tutaj :) – sameera207

+0

@ Sameera207 dzięki za przykładowy link (który używa Mongo jako bazy danych). Jeśli chcesz zobaczyć ciekawą implementację EAV, sprawdź SpreeCommerce: https://github.com/spree/spree – rewritten

+0

dzięki będzie wyzywająco wyglądać;) – sameera207

1

Baza danych NoSQL (baza danych dokumentów Mongodb, CouchDB) może najlepiej pasować do tego lub używać redis. Zgodnie z moimi myślami możesz użyć Vertical Table concept Spróbuj uruchomić Rails 2.x Demo of application dla MySQL. Możesz spróbować z Mongodb, sprawdź czy jest to potrzebne.

+0

Nie wiem, dlaczego dali ci -1 :) thnx za odpowiedź – xaxa

Powiązane problemy