find_or_create_by dans Rails 3 et la mise à jour pour la création de dossiers
Je ne suis pas sûr si je dois être la mise à jour des enregistrements de cette façon, ou si je suis en manque de quelque chose.
J'ai une table avec 5 colonnes (non compris les horodatages et id) 3 qui sont distinctes, et 2 qui seront mis à jour. Les 3 que je vais trouver ou de créer de room_id, la date et la source. Les 2 autres sont des prix et des places disponibles (modification de ces horaires, journaliers, etc.)
Ma question est, dois-je d'abord trouver ou créer le dossier, puis mise à jour (ou créer) le prix et les spots ou je peux le faire tout à la fois? Vous pouvez voir les deux façons que je fais maintenant, et je ne sais pas si sa en fait de faire ce que j'attends.
Aussi, est-il un inconvénient à faire un find_and_create_by comme ça?
Grâce
private
def self.parse_data(params,data)
data.beds.each do |bed|
room = Room.find_or_create_room(bed.title, params[:id])
#find clones somehow
#puts bed.nights.first.price
bed.nights.each_with_index do |night,index|
available = Available.find_or_create_by_room_id_and_bookdate_and_source(
:room_id => room.id,
:bookdate => (params[:date].to_date)+index,
:source => data.class.to_s#,
#:price => night.price
)
#available.price = night.price
#available.spots = night.spots
#available.save
end
end
OriginalL'auteur holden | 2011-04-07
Vous devez vous connecter pour publier un commentaire.
Voici deux approches.
la Première vous pouvez étendre
Available
avec méthode exacte dont vous avez besoin:utilisation
Que c'est gênant. Donc, pour être plus flexible, vous pouvez créer
update_or_create_by...
méthode pourActiveRecord
à l'aide demethod_missing
magie:Alors maintenant, vous pouvez l'utiliser:
find_by_id' for #<Class:0x9aaad6c>): config/initializers/active_record_monkey_patch.rb:7:in
method_missing'Vous ne devriez pas! 🙂 on dirait que vous n'avez pas
id
domaine pour votre classe. Pouvez-vous écrire un test?Belle solution! Cependant, je reçois la même erreur que @DavidRyder lors de l'utilisation d'une autre méthode dynamique dans le même fichier (ou indirectement à l'aide d'un joyau qui utilise une méthode dynamique). Par exemple, find_or_create_by_* donne une méthode non erreur. Je crois que le
super
partie ne fonctionne pas.ok, je vais vérifier 🙂
Toujours pas une erreur comme la vôtre. Test sera utile 🙂
OriginalL'auteur fl00r
En fait, il est sans aucun piratage.
Au lieu de find_or_create_by vous pouvez utiliser find_or_initialize_by et mis à jour les attributs avec robinet
Au départ, cela peut semble encombré, mais il est en train de faire exactement ce que vous avez demandé.
Trouver l'enregistrement, l'instancier si elle n'est pas trouvée et mise à jour de ses attributs.
ce qui pourrait être appelé "find_and_update_or_create_by", fortunatelly personne ne l'a fait. 😉
Espérons que cette aide.
Avez-vous un robinet avant de la ne bloc?
OriginalL'auteur Tian Chen