Saturday, January 21, 2012

Моделі в Rails

      Я був чесно кажучи приємно здивований тим наскільки потужниі засоби роботи з базами представлені в 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


Далі буде...


No comments:

Post a Comment

 
 
Blogger Templates