עבודה עם ActiveRecord בסינטרה

בד"כ מרבית האפליקציות שאני כותב לווב לא משתמשות במסד נתונים, והן רק API, אבל מידי פעם יש גם בקשה שהאפליקציה תהיה ממשק ווב, או תצוגה של מידע ממסד הנתונים, ואז כאב הראש מתחיל.

דבר ראשון אני לא חזק בעיצוב, ובטח כבר גיליתם את זה באחד הפוסטים האחרונים שלי (רמז). ויש דפדפנים פשוט מעצבנים בשוק (ע"ע IE של מיקרוסופט), כך שאם מישהו רוצה עיצוב טוב וידידותי, מתבקש לרכוש template שיתאים לו. הרוב ד"א מעדיפים לא לרכוש, אבל עדיין מתלוננים על חוסר עיצוב ידידותי מספיק.

אז לאחרונה התבקשתי לבנות מערכת כזו, והיא לצערי גם חייבת לעבוד מול מסד נתונים (בחרתי את PostgreSQL, הרי לא הגיוני לבחור את MySQL לשום דבר, גם ככה היו לי מיליארד בעיות עם Foreign Key איתו כאשר כן ניסיתי לתכנן את המערכת, והוא לא אמין בשום צורה גם ככה במידע שהוא שומר), וכמובן שאלך על רובי וסינטרה לגודל כזה "גדול" של מערכת (2.5 מסכים), וכמובן במקום להשתמש בSQL נקי (עוד עושים את זה כיום ?), אני משתמש בORM, אשר לאחר בדיקה של 3 מהם ברובי, הגעתי להבנה כי ActiveRecord הוא הכי נורמאלי מכולם (למרות שגם לו יש הרבה חסרונות שגיליתי).

הבעיה של ActiveRecord הוא בכך שהוא נבנה עבור Rails, אבל למרות זאת הוא גם יודע לעמוד כ standalone. הענין הוא שקודם צריך לשמור את נתוני ההתחברות, על ידי הרצת מתודה "סטאטית" (מתודת Instance בשמה האמיתי ברובי, אשר היא הכי קרובה למתודה סטטית שאתם מכירים בשפות שונות). אז איך עובדים איתו בסינטרה ?

#!/usr/env ruby
require 'rubygems'
require 'sinatra'
require 'active-record'
configuration :development do
ActiveRecord::Base.establish_connection(
:adapter => 'postgresql',
:username => 'postgres',
:password => 'secretstuff',
:database => 'dev_db'
)
end

configuration :production do
ActiveRecord::Base.establish_connection(
:adapter => 'postgresql',
:username => 'postgres',
:password => 'secretstuff',
:database => 'db'
)
end

class ActiveRecord::Base
def self.update_or_insert(fields) # fields are hash table eg: {:id => 1}
id = fields.delete(:id).to_s
if id.nil? || id.empty? || id.eql?('0')
self.create(fields)
else
row = self.find(id)
row.update_attributes(fields) # don't use update, ever !
end
end
end

class FirstTable < ActiveRecord::Base
#set_primary_key 'id' # only if you have problems while inserting stuff
end

get '/' do

FirstTable.find(1).text # print something as a template ...
end

בקוד כאן גם הוספתי עוד ערך מוסף של משהו שלדעתי חסר ב ActiveRecord שזה update_or_insert. הקוד הזה נעשה מזיכרון יותר מאשר כל דבר אחר, ולא ניסיתי את מה שרשמתי כאן מעבר לזיכרון שלי.

אני מקווה שזה יעזור גם לכם 🙂

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s