🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
3 messages
3 total messages Started by Jaroslaw Zabiello Tue, 03 Oct 2006 11:20
Wspolne modele dla wielu aplikacji RoR
#216
Author: Jaroslaw Zabiello
Date: Tue, 03 Oct 2006 11:20
38 lines
1657 bytes
Chce miec wspolne definicje modeli dla wielu aplikacji RoR. W tym celu,
wszystkie model definiuje w zewnetrznym module i domieszkuje odpowiednie
klasy.

Np. /projekt1/app/models/destination.rb zawiera przykladowo:
 
require $SHARED + 'destination_module.rb'
class Destination < ActiveRecord::Base
  set_primary_key "Destination_ID"
  set_table_name "refdestinations"
  extend DestinationModule
end

Zas /shared/destination_model.rb zawiera

module DestinationModule 
  def jakas_medoda
    #...
  end
end

I to dziala. Jednakze nie podoba mi sie, ze nie moge do modulu wyniesc
metod ustawiajacych nazwe tabeli i primary key. Chcialbym aby mozna bylo to
wszystko zgromadzic w 1 miejscu:

module DestinationModule 
  set_primary_key "Destination_ID"
  set_table_name "refdestinations"
  def jakas_medoda
    #...
  end
end

Tak jednak nie dziala...

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: Wspolne modele dla wielu aplikacji RoR
#217
Author: Marcin Mielżyński
Date: Tue, 03 Oct 2006 18:39
75 lines
2894 bytes
Jaroslaw Zabiello wrote:
> Chce miec wspolne definicje modeli dla wielu aplikacji RoR. W tym celu,
> wszystkie model definiuje w zewnetrznym module i domieszkuje odpowiednie
> klasy.
> 
> Np. /projekt1/app/models/destination.rb zawiera przykladowo:
>  
> require $SHARED + 'destination_module.rb'
> class Destination < ActiveRecord::Base
>   set_primary_key "Destination_ID"
>   set_table_name "refdestinations"
>   extend DestinationModule
> end
> 

tu musisz rozróżnić aby mieć reloadable w trybie development: - możliwe 
że railsy mają swój odpowiednik

if RAILS_ENV == "development"
     load File.dirname(__FILE__) + "/destination_module.rb"
     RAILS_DEFAULT_LOGGER.info "przeładowano..."
else
     require "destination_module"
end



class Ble < ActiveRecord::Base
     extend DestinationModule
end



> Zas /shared/destination_model.rb zawiera

> I to dziala. Jednakze nie podoba mi sie, ze nie moge do modulu wyniesc
> metod ustawiajacych nazwe tabeli i primary key. Chcialbym aby mozna bylo to
> wszystko zgromadzic w 1 miejscu:
> 
> module DestinationModule 
>   set_primary_key "Destination_ID"
>   set_table_name "refdestinations"
>   def jakas_medoda
>     #...
>   end
> end
> 

Nie zadziała ponieważ set_... musisz zawołać w kontekście klasy 
receivera odocelowej. Prędzej tak:

module DestinationModule
     def self.extended c
         c.set_table_name "refdestinations"

	lub jeśli metoda nie jest publiczna:

         c.instance_eval do
             set_table_name "refdestinations"
         end

     end

end


Trzeba też zaznaczyć że Railsy robią globa na katalog app/ i 
kategoryzują klasy po ich rodzicach. Nie interesują się z żadnym razie 
nazwami katalogów models, controllers itd... Wrzuć jakiś model do 
katalogu controllers - też będzie działać - dlatego też taki moduł w 
powietrzu nie przeszkadza. W 1.2 ma się to zmienić za sprawą autoload magic.



lopex
Re: Wspolne modele dla wielu aplikacji RoR
#218
Author: Marcin Mielżyński
Date: Tue, 03 Oct 2006 18:44
4 lines
1055 bytes
albo po prostu podlinkować w systemie plików... capistrano się do tego 
nadaje rewelacyjnie.

lopex
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads