Ruby On Rails in UA Icon_home Главная Add to bookmarks Translate translate Profile Войти
Регистрация Форум Блоги Пользователи Ресурсы Список джемов      Поиск   

Page_edit

На форуме

ruby [30]cgi [15]will_paginate [13]session [10]rails [9]ror [9]ruby on rails [8]mongrel [7]NetBeans [7]rails 2.0 [7]

В блогах

rails [3] ruby [3] sqlite [1] gem [1] rake [1] debug [1] ror [1] NetBeans [1] google [1] localization [1]

Миграции при конекте к нескольким базам

Date2008-08-29 UserRuslan Voloshin Commentкоментарии 0

При использовании двух быз данный конфиг ко второй был описан в пердыдущем посте появляется задача в миграциях и тестах.

В качестве выходя из данной ситуации было решено для тестов сваливать все таблицы в одну базу так  проще разрабатывать  и тестить. По этому был переписан всего один рейк так который будет дампить две базы в один файл schema.rb

lib/tasks/db_migrations.rake

namespace :db do
  namespace :schema do
    desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
    task :dump => :environment do
      require 'active_record/schema_dumper'
      File.open(ENV['SCHEMA'] || "db/schema.rb", "w") do |file|
        ActiveRecord::SchemaDumper.dump([ActiveRecord::Base.connection, MarketingDb.connection], file)
      end
    end
  end
end

для напоминания приведу еще раз models/marketing_db.rb

class MarketingDb < ActiveRecord::Base
  self.abstract_class = true
  establish_connection("marketing_db_#{RAILS_ENV}".to_sym) unless RAILS_ENV.eql?('test')
end

Добавляем в application.rb загрузку нашей библиотеки которая переопределает ActiveRecord::SchemaDumper.dump 

require 'multi_db' #rake task for dump 2 databases

-----------------------------

#file lib/multi_db.rb

module ActiveRecord
  class SchemaDumper
#Create dump.rb for many databases
    def self.dump(array_connects, stream=STDOUT)
      array_connects = array_connects || ActiveRecord::Base.connection
      if array_connects.is_a?(Array)
        array_connects.each { |connect|
          new(connect).dump(stream, connect.eql?(array_connects.first), connect.eql?(array_connects.last))
        }
      else     
        new(array_connects).dump(stream)
      end
      stream
    end
   
    def dump(stream, is_header = false, is_footer = false)
      header(stream) if is_header
      tables(stream)
      trailer(stream) if is_footer
      stream
    end

  end
end

   

#и немного доопределим что бы миграции нормально проходили и переключались между базами в этом же файле lib/multi_db.rb

module ActiveRecord
  class Migration
   
    def self.use_db(db_name)
      ActiveRecord::Base.establish_connection("#{db_name}_#{RAILS_ENV}".to_sym)
    end

    def self.restore_connection
      ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
    end
  end
end

и теперь дошли до самого файла миграции

class CreateMdbProducts < ActiveRecord::Migration
 
  def self.up
    use_db('marketing_db')

    create_table :mdb_products do |t|
      t.string :description, :null => false
      t.timestamps
    end
   
    restore_connection
  end

  def self.down
    use_db('marketing_db')

    drop_table :mdb_products
   
    restore_connection
  end
end


Немного поколбасило вчера наш сервачек

Date2008-08-29 UserRuslan Voloshin Commentкоментарии 0

Как говорят если хочшеь сделать человеку хорошо сначала сделай ему плохо потом верни как было.

(так у нас на военной кафедре говорили)

Вчера я решил сделать маленкький апдейт который атянулся до начала 5 утра сегодняшнего дня. Раноше я не понимал почему системный администратор не любит перегружать машину которая уже поднята пол месяца и больше, оказывается есть много причин :)

За эту ночь я востанавливал сетевуху которая непонятным образом отвалилась. пришглось добавить кое что в загрузку ядра потом отключить кое что в биосе и так далее. В итоге мне хорошо помошла статься по этой ссылке

Kernel panic - not syncing: IO-APIC + timer doesn't work

If you get this message when rebooting, add "noapic" to the kernel options when booting, and add it to Grub's kernel line (/boot/grub/grub.conf to make it permanent for this kernel).

Alternatively : "I got a ASUS M2N-MX just installed and also got the same error when begin installation. I change the ACPI support to 2.0 in BIOS (also put the correct frequency and delays in memmories), and since too many trestarts and power off and power on to test I didn't get the "Kernel Panic - not syncing: IO-APIC + timer doesn't work!" anymore! If this option is not present in the mother you buy, just update the BIOS (I have not to do it). I also disabled in BIOS Chipset-> SouthBridge-> MCP61 ACPI HPET TABLE : If you enable it you will get again the IO-APIC error..."

"running with noapic is for the replacement for the old PIC chip that used to come on motherboards that allowed you to setup nterrupts. sometimes motherboards come with small defects ( called bugs ) and loading the kernel without the this apic is the only way to load you're system. my PC at home would not run CentOS 5 smp kernel or Fedora 5,6,7,8 without setting noapic.the way to test it is to edit the grub menulist while booting and adding noapic at the end"

In case you're interested, APIC is "an Advanced Programmable Interrupt Controller (APIC), a more intricate Programmable Interrupt Controller (PIC) containing a magnitude more outputs and much more complex priority schemas. Advanced IRQ management."

Lots of ACPI errors

Looks like Linux doesn't like the way this host supports ACPI:

ACPI Error (psargs-0355): [HPTF] Namespace lookup failure, AE_NOT_FOUND
ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.HPET._STA] (Node ffff81003bfb17f0), AE_NOT_FOUND
ACPI: PCI Interrupt Link [LNK1] (IRQs 5 7 9 10 11 14 15) *0, disabled.

Плюс наличие следующих параметров в /etc/grun/grub.conf

  noapic acpi=off

если в кратце то все хотя были еще поломки с мускулом для другого сайта  и так далее короче вечерок удался на славу.

created_at 4:23

Подключение рейлс приложения к нескольким базам данных

Date2008-08-28 UserRuslan Voloshin Commentкоментарии 0

И так начнем с добавления еще одного конекшина в конфиг базы данных

database.yml

development:
  adapter: postgresql
  database: application_development

marketing_db_development:
  adapter: postgresql
  database: marketing_db_development
  username: postgres

 


Теперь  делаем модель для виртуального адаптера  от которой потом будут наследоваться все таблицы которые будут браться из другой базы

class MarketingDb < ActiveRecord::Base
  self.abstract_class = true
  establish_connection("marketing_db_#{RAILS_ENV}".to_sym)
end

А дальше для проверки запускаем консоль

[wr@bublik trunk]$ script/console
Loading development environment (Rails 2.1.0)
>> ManagementDb.connection.execute("select * from users")
=> #<Mysql::Result>


как видно запросы обрабатываются и отсылаются к другой базе, далее попытаюсь показать наглядней

данные из основной базы

>> User.first
=> #<User id: 267300, account_id: 208552, sasp_id: 232123370, address_id: 35917, title

Попытаемся сделать запрос к дополнительной базе

 ManagementDb.connection.select_all("select * from users")
=> [{"yahoo_handle"=>"wert", "updated_at"=>"2008-08-27 05:47:05", "raiting"=

Запрос выполнился но рельзультатов не видно для этого создадим новый клас который будет конектиться к дополнительной базе и искать пользователей в ней

>> class MailUser < ManagementDb
>> set_table_name "users"
>> end
=> nil
>> MailUser.first
=> #<MailUser id: 1, login: "admin", email: "rebisall@gmail.com", first_name: "Ruslan",

и вот результат положительный мы нашли пользователя в другой бузе данных

Ждите в следующем посте описание миграций при друх коннектах

Построение запросов с помощью conditions_fu

Date2008-08-20 UserRoman V. Babenko Commentкоментарии 2

Уже давно хотел избавиться от упоминания в запросах sql конструкций.

Но построение через хеши условий для поиска в нынейней версии RoR(2.1) к сожалению не возможно.

Такие запросы типа: Строка по маске, больше чем, меньше чем, больше, находиться в диапазоне, не находиться в диапазоне - построить с помощью хешей невозможно.

Объединение условий по OR опять же сводилось к написанию SQL.

Плагин conditions_fu расширяет возможности ActiveRecord::Base#find методами позволяющими решить вышеуказнные проблемы.

Установка

$ script/plugin install git://github.com/xgamerx/conditions_fu.git

Использование
Person.all(:conditions => { :age.gt => 30, :name.like => "%упкин" })

найдет всех кто заканчивается на "упкин" старше 30 лет

Person.any(:conditions => { :age.gt => 30, :name.like => Person.all(:conditions => { :age.gt => 30, :name.like => "%name%" })
 })
найдет всех старше 30 лет или чье имя заканчивается на "упкин"
Подробней и перечень операторов можно посомтреть тут rubyhammer.com/articles/2008-08-20-182530-conditions_fu-postroitel-zaprosov

Отношение многие-ко-многим в рамках одной модели

Date2008-08-13 UserRoman V. Babenko Commentкоментарии 1

Существует определенный класс задач, когда необходимо реализовать отношение "многие-ко-многим". Довольно интересным являеться случай когда узел может иметь больше одного родителя. Проще говоря, математический граф построенный на одной модели когда его элементы пренадлежат одной сущности.

Ruby  CMF  Web 
    \  |  / 
     \_|_/ 
     Rails 
     / | \ 
    /  |  \ 
  AR  AV   AC

Создадим миграцию для модели категорий


class CreateCategories < ActiveRecord::Migration
def self.up
create_table :categories do |t|
t.column :name, :string

t.timestamps
end
end

def self.down
drop_table :categories
end
end

Создадим миграцию для таблицы со связями


class Relations < ActiveRecord::Migration
def self.up
create_table :relations, :id => false do |t|
t.column :parent_id, :integer
t.column :child_id, :integer
end
end

def self.down
drop table :relations
end
end

Основной интерес составляет модель категорий и декларация связей has_and_belongs_to_many через вышеупомянутую таблицу.


class Category < ActiveRecord::Base
has_and_belongs_to_many :parents,
:join_table => 'relations',
:foreign_key => 'parent_id',
:association_foreign_key => 'child_id',
:class_name =>'Category'

has_and_belongs_to_many :children,
:join_table => 'relations',
:foreign_key => 'child_id',
:association_foreign_key => 'parent_id',
:name => 'Category'
end

Миграция заполняющая тестовые данные моделирующиее граф указанный на картинке


class TestDataGenerate < ActiveRecord::Migration
def self.up
c_ruby = Category.create :name => 'Ruby'
c_cmf = Category.create :name => 'CMF'
c_web = Category.create :name => 'WEB'

c_rails = Category.create :name => 'Rails'

c_ar = Category.create :name => 'AR'
c_av = Category.create :name => 'AV'
c_ac = Category.create :name => 'AC'

c_rails.parents << [c_ruby, c_cmf, c_web]

c_rails.children << [c_ar, c_av, c_ac]
end

def self.down

end
end

Переходим в консоль и проверяем правильность выполнения поставленной задачи. Находим категорию Rails и запрашиваем у нее имена(для краткости вывода) дочерних и родительских категорий.

>> rs = Category.find_by_name('Rails')
=> #
 >> rs.children.find :all, :select => :name
 => [#, #, #]
 >> rs.parents.find :all, :select => :name
 => [#, #, #]

Хочу отметить, что такое решение являеться независимым от синтаксиса SQL большенства реляционных БД отвечающим стандарту SQL92.

Другие варианты решения и нюансы описаны в статьях:

* http://szeryf.wordpress.com/2007/06/27/self-referential-many-to-many-relations-in-ruby-on-rails/

* http://wiki.rubyonrails.org/rails/pages/HowToCreateASelfReferentialManyToManyRelationship

Существует решение в виде плагина: http://tammersaleh.com/posts/acts_as_graph

Но как пишет его автор, плагин давно не тестировался.

P.S. acts_as_graph -реализует рекурсивный обход графа. 

RssAtom RssRss
Реклама: autocad надувные матрасы вид интересные мониторы подбирайте
Ключевые слова:
Гости: 54 Онлайн: Valeri_K, Guerra, Alekseeff,
Rambler's Top100
О проекте по всем вопросам обращайтесь на support
Rubyclub.com.ua Copyright © 2007 - 2008