Я був чесно кажучи приємно здивований тим наскільки потужниі засоби роботи з базами представлені в Rails. Створення таблиць оформляється в вигляді міграцій, що надає універсальність при підключенні будь якої БД. Моделі предсталяють з себе дійсно моделі в кращих тонах MVC, після того як ви з ними познайомитесь можна вважати що не пусто вони стоять на першому місці)). Чим мені сподобались моделі в рельсах, та усім мені вони сподобались. Оскільки я в рельсах новенький, тай в рубі тоже, але мова зара про рельси, то хочеться сказати що краса коду і лаконічність немає меж, все чітко і логічно без сучка і задорінки). Моделі в rails вміщують в собі таку штукендорину як валідатори, що не може не радувати, оскільки в цьому випадку звязок відчувається здалека. Ні валідатори можуть знаходитись не тільки в моделях, в моделях вони тільки підключаються для коректного заповнення в базу даних. А ще є таке поняття як колбеки, що є важливим атрибутом для моделі, хоча може і не використовуватись як і валідатори. Що до звязків то тут я був найбільше здивований, оскільки звязки є дуже міцними між моделями і зручно контрольовані і взаємозалежними з БД. Логіка яка закладена в вашій базі при написанні всього кількох рядків просто переносяться в ваш проект і це реально зручно. Про Rails і моделі ви можете багато чого знайти в гуглі, а також і по цьому лінку.
Я хочу тільки привести один простий приклад що до реалізації звязків моделей, а саме: є дві таблички користувачі("user") та повідомлення("message"), відповідно для того щоб користувачі могли писати повідомлення одні одним потрібно щоб в табличці "message" були такі поля "receiver_id" - отримува та "sender_id" - відправник, і оба ці поля мають бути привязані до таблички "user". Що до прикладу то він дещо специфічний тому я його і розглянув, а результат наступний:
/app/models/message.rb
class Message < ActiveRecord::Base
belongs_to :sender, :class_name => "User"
belongs_to :receiver, :class_name => "User"
end
/app/models/user.rb
class User < ActiveRecord::Base
has_many :messageOut, :foreign_key => "sender_id", :class_name => "Message"
has_many :messageIn, :foreign_key => "receiver_id", :class_name => "Message"
end
З допомогою цих декількох рядків ми вказуємо чіткі звязки між моделями повідомлення та користувачів. Після чого ми можемо в любому контролері виконати наступну операцію і насолоджуватись результатом:
user = User.find(1)
messageIn = user.messageIn;
messageOut = user.messageOut;
userReceiver = messageOut[0].receiver
де user - це користувач з id = 1, messageIn - вхідні повідомлення користувача, а в Out - відповідно вихідні, для прикладу в userReceiver - ми вже маємо отрмавача одного із повідомленнь які були надіслані корисувачем, до прикладу ім'я отримувача дістаєм так: userReceiver.firstname.
Міграції для даних моделай мають наступний вагляд:
/db/migrate/<time>_users.rb
class Users < ActiveRecord::Migration
def up
create_table :users do |t|
t.string :firstname, :limit=>100
t.string :surname, :limit=>150
t.string :nick, :limit=>200
t.string :email
t.string :password, :limit=>32
t.timestamps
end
end
def down
drop_table :users
end
end
/db/migrate/<time>_message.rb
class Messages < ActiveRecord::Migration
def up
create_table :messages do |t|
t.string :team, :limit=>100
t.text :text
t.integer :status
t.integer :deleted
t.integer :re
t.references :sender
t.references :receiver
t.timestamps
end
execute <<-SQL
ALTER TABLE messages
ADD CONSTRAINT fk_message_sender
FOREIGN KEY (sender_id)
REFERENCES users(id)
SQL
execute <<-SQL
ALTER TABLE messages
ADD CONSTRAINT fk_message_receiver
FOREIGN KEY (receiver_id)
REFERENCES users(id)
SQL
end
def down
drop_table :messages
end
end
Далі буде...
Я хочу тільки привести один простий приклад що до реалізації звязків моделей, а саме: є дві таблички користувачі("user") та повідомлення("message"), відповідно для того щоб користувачі могли писати повідомлення одні одним потрібно щоб в табличці "message" були такі поля "receiver_id" - отримува та "sender_id" - відправник, і оба ці поля мають бути привязані до таблички "user". Що до прикладу то він дещо специфічний тому я його і розглянув, а результат наступний:
/app/models/message.rb
class Message < ActiveRecord::Base
belongs_to :sender, :class_name => "User"
belongs_to :receiver, :class_name => "User"
end
/app/models/user.rb
class User < ActiveRecord::Base
has_many :messageOut, :foreign_key => "sender_id", :class_name => "Message"
has_many :messageIn, :foreign_key => "receiver_id", :class_name => "Message"
end
З допомогою цих декількох рядків ми вказуємо чіткі звязки між моделями повідомлення та користувачів. Після чого ми можемо в любому контролері виконати наступну операцію і насолоджуватись результатом:
user = User.find(1)
messageIn = user.messageIn;
messageOut = user.messageOut;
userReceiver = messageOut[0].receiver
де user - це користувач з id = 1, messageIn - вхідні повідомлення користувача, а в Out - відповідно вихідні, для прикладу в userReceiver - ми вже маємо отрмавача одного із повідомленнь які були надіслані корисувачем, до прикладу ім'я отримувача дістаєм так: userReceiver.firstname.
Міграції для даних моделай мають наступний вагляд:
/db/migrate/<time>_users.rb
class Users < ActiveRecord::Migration
def up
create_table :users do |t|
t.string :firstname, :limit=>100
t.string :surname, :limit=>150
t.string :nick, :limit=>200
t.string :email
t.string :password, :limit=>32
t.timestamps
end
end
def down
drop_table :users
end
end
/db/migrate/<time>_message.rb
class Messages < ActiveRecord::Migration
def up
create_table :messages do |t|
t.string :team, :limit=>100
t.text :text
t.integer :status
t.integer :deleted
t.integer :re
t.references :sender
t.references :receiver
t.timestamps
end
execute <<-SQL
ALTER TABLE messages
ADD CONSTRAINT fk_message_sender
FOREIGN KEY (sender_id)
REFERENCES users(id)
SQL
execute <<-SQL
ALTER TABLE messages
ADD CONSTRAINT fk_message_receiver
FOREIGN KEY (receiver_id)
REFERENCES users(id)
SQL
end
def down
drop_table :messages
end
end
Далі буде...
No comments:
Post a Comment