Stéphane Thibaudeau wrote:
D’après les explications initiales je n’arrive pas à déterminer si des
saisons peuvent être associées à des maisons mais sans tarif
correspondant.
Pas besoins non
Pour ce qui est de la traduction ensuite en modèles ActiveRecord
belongs_to :maison
belongs_to :saison
Saison
has_many :tarifs
has_many :maisons, :through => :tarifs
Les réserves de base :
- Si l’hypothèse de départ est fausse forcément ça marche beaucoup moins
bien…
- Tout ceci écrit sans filet et sans test bien évidemment
Beau sans filet car l’idee de base et la, j’ai maintenant une solution
fonctionnel avec 2-3 finnesse en plus mais la base et la.
Pour les interressé voici le recap général qui répond bien à mes besoins:
# 001_create_houses.rb
class CreateHouses < ActiveRecord::Migration
def self.up
create_table :houses do |t|
t.column :name, :string
end
end
def self.down
drop_table :houses
end
end
002_create_tariffs.rb
class CreateTariffs < ActiveRecord::Migration
def self.up
create_table :tariffs do |t|
t.column :house_id, :integer
t.column :season_id, :integer
t.column :price, :string
end
end
def self.down
drop_table :tariffs
end
end
003_create_seasons.rb
class CreateSeasons < ActiveRecord::Migration
def self.up
create_table :seasons do |t|
t.column :name, :string
end
end
def self.down
drop_table :seasons
end
end
app/models/house.rb
class House < ActiveRecord::Base
has_many :tariffs do
def find_by_season( season )
find_by_season_id( season.id )
end
end
has_many :seasons, :through => :tariffs
end
app/models/tariff.rb
class Tariff < ActiveRecord::Base
belongs_to :season
belongs_to :house
validate_uniqueness_of :house, :scope => :season_id
end
app/models/season.rb
class Season < ActiveRecord::Base
has_many :tariffs
has_many :houses, :through => :tariffs
end
Une fois tous cela mis en place, voila quelques exemple d’utilisation:
# Insertion initial grace à la console
house1 = House.create(:name => 'House 1')
house2 = House.create(:name => 'House 2')
house3 = House.create(:name => 'House 3')
high_season = Season.create(:name => ‘High’)
medium_season = Season.create(:name => ‘Medium’)
low_season = Season.create(:name => ‘Low’)
house1.seasons << high_season
house1.seasons << medium_season
house2.seasons << high_season
Créer des tarifs
house1.tariffs.create( :season => high_season, :price => 1000 )
house1.tariffs.create( :season => medium_season, :price => 500 )
Trouver le tarif pour un saison, dependant d’une maison
house1.tariffs.find_by_season( high_season )
OU
house1.tariffs.detect { |t| t.season_id = high_season.id }
Trouver toutes les maisons avec un tarif durant la saison souhaité
high_season.houses
Ou de trouver les tariffs, puis trouver les maisons
tariffs.find( :all, :conditions => {:season => high_season}, :include =>
:houses )
Et voila au final au solution que je trouve simple et logic tous en
répondant à mes attentes. Je souhaiterai remercier “liquid” de rails
weenie pour m’avoir donner cette solution.
Merci à Stéphane, Guillaume et Jean-François pour votre aide.
Sébastien Grosjean - ZenCocoon