08-09-2011, 04:44 PM
(Modification du message : 08-09-2011, 04:44 PM par Sephi-Chan.)
Ton modèle de liaison Contact peut porter d'autres données que les foreign key. Tu peux lui donner des attributs comme pour n'importe quel modèle.
Si tu veux donner une valeur par défaut à des attributs, je te conseille la très bonne gem default_value_for. Elle est très souple à l'utilisation.
Si tu préfères le faire à la main, tu peux utiliser la méthode de callback after_initialize de ce modèle.
Autrement, tu peux définir une valeur par défaut au niveau de la base de données (via une migration change_column_default).
Et ensuite, à l'utilisation :
Par ailleurs, je te déconseille de stocker la date de naissance dans un champ de type string, mais plutôt date ou datetime.
Voici une alternative à ta méthode create_random_player. L'utilisation d'une variable d'instance (@p) n'était pas utile. De plus, fais attention à ce genre de méthodes si tu y mets vraiment du random : mieux vaut générer les valeurs aléatoire et les passer en argument, ça rend le code plus facile à tester unitairement.
Si tu veux donner une valeur par défaut à des attributs, je te conseille la très bonne gem default_value_for. Elle est très souple à l'utilisation.
Si tu préfères le faire à la main, tu peux utiliser la méthode de callback after_initialize de ce modèle.
Autrement, tu peux définir une valeur par défaut au niveau de la base de données (via une migration change_column_default).
class Contract < ActiveRecord::Base
belongs_to :team
belongs_to :player
# Si tu optes pour la gem default_value_for.
default_value_for :duration, 3
# Si tu préfères faire ça à la main.
def after_initialize
# Attention à bien faire ||= pour ne pas surcharger s'il y a déjà une valeur.
self.duration ||= 3
end
end
Et ensuite, à l'utilisation :
player = Player.find(1)
team = Team.find(1)
# Le mode automatique. Pratique s'il n'y a pas de données annexes (ou si elles sont affectées par défaut).
team.players << player # Ça crée un objet en affectant player_id et team_id.
player.teams << team # Ça revient au même mais je trouve ça moins naturel.
# Le mode plus manuel, utile quand tu veux affecter des attributs annexes.
contract = team.contacts.create player_id: player.id,
duration: 3
Par ailleurs, je te déconseille de stocker la date de naissance dans un champ de type string, mais plutôt date ou datetime.
Voici une alternative à ta méthode create_random_player. L'utilisation d'une variable d'instance (@p) n'était pas utile. De plus, fais attention à ce genre de méthodes si tu y mets vraiment du random : mieux vaut générer les valeurs aléatoire et les passer en argument, ça rend le code plus facile à tester unitairement.
# Attention : c'est la notation des hash de Ruby 1.9, utilisable quand la clé est un symbole (bonne pratique).
# Quand la clé est une chaîne, il faut toujours faire "jambon" => "fumé".
def self.create_random_player
Player.new name: "Toto",
first_name: "James",
birthday: Date.new(2000, 12, 31)
end