Как говорят если хочшеь сделать человеку хорошо сначала сделай ему плохо потом верни как было.
(так у нас на военной кафедре говорили)
Вчера я решил сделать маленкький апдейт который атянулся до начала 5 утра сегодняшнего дня. Раноше я не понимал почему системный администратор не любит перегружать машину которая уже поднята пол месяца и больше, оказывается есть много причин :)
За эту ночь я востанавливал сетевуху которая непонятным образом отвалилась. пришглось добавить кое что в загрузку ядра потом отключить кое что в биосе и так далее. В итоге мне хорошо помошла статься по этой ссылке
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."
Looks like Linux doesn't like the way this host supports ACPI:
Плюс наличие следующих параметров в /etc/grun/grub.conf
noapic acpi=off
если в кратце то все хотя были еще поломки с мускулом для другого сайта и так далее короче вечерок удался на славу.
created_at 4:23
И так начнем с добавления еще одного конекшина в конфиг базы данных
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",
и вот результат положительный мы нашли пользователя в другой бузе данных
Ждите в следующем посте описание миграций при друх коннектах
Уже давно хотел избавиться от упоминания в запросах 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
Существует определенный класс задач, когда необходимо реализовать отношение "многие-ко-многим". Довольно интересным являеться случай когда узел может иметь больше одного родителя. Проще говоря, математический граф построенный на одной модели когда его элементы пренадлежат одной сущности.
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 -реализует рекурсивный обход графа.
Немно смешно и грустно. Но иногда встречаются посты на тему "все не работает".
Кот в сапогах попросил людоеда превратиться в мышь.
- Да. Ответил людоед. ОП - и.... превратился в мышь...
- Кот кинулся на мышь .... а мыш взлетела и повисла на потолке... потому как _летучей_ оказалась !
Вывод: если хотите получить правильный результат, то максимально точно формулируйте задачу...
Платформа: win, nix ?
Версия rails ?
Хостинг или локальное использование ?
Версия базы данных ?
Кодировка базы данных ?
Можно прописать это все в коментариях к профайлу и отображать в каждом посте, если вышеуказанные параметры более-менее стабильны.
Каждая мелочь приближает вас с решению вашей проблемы :-)
P.S. "шеф все пропало" - приключения капитана Врунгеля :-)