Kopiowanie wartości jednego modelu do drugiego

Mam dwa modele Ticket i Reservation.
Oba posiadają pola
:title, :description, :price, :type
dodatkowo Ticket ma jeszcze dwa inne.

Jak sprytnie przepisać dane z Reservation do Ticket żeby nie robić, tak

ticket.title = reservation.title ticket.description = reservation.description ticket.price - reservation.price .............
żeby było DRY

[quote=pski]Mam dwa modele Ticket i Reservation.
Oba posiadają pola
:title, :description, :price, :type
dodatkowo Ticket ma jeszcze dwa inne.

Jak sprytnie przepisać dane z Reservation do Ticket żeby było DRY[/quote]

$w(title description price type).each do |attribute| ticket[attribute]=reservation[attribute] end
Możesz też iterować po

(Ticket.columns.map(&:name) & Reservation.columns.map(&:name)) - ["id"]

Można również skorzystać z atrybutów:

ticket.attributes = reservation.attributes

a nie lepiej przypisać ticket do rezerwacji bądź na odwrót? np. ticket belongs_to :reservation czy tam na odwrót.

Albo zrobić jeden model zamiast dwóch?
Np. tylko Ticket, do którego dodać pole :confirmed => :boolean
Jeśli Ticket.confirmed == false, to jest to rezerwacja, a jeśli true, to pełnoprawny bilet.

[quote=Bragi](Ticket.columns.map(&:name) & Reservation.columns.map(&:name)) - ["id"]
[/quote]
Tutaj też da się prościej (lepiej jednak użyć attributes):

(Ticket.column_names & Reservation.column_names) - ["id"]

[quote=sabon]Albo zrobić jeden model zamiast dwóch?
Np. tylko Ticket, do którego dodać pole :confirmed => :boolean
Jeśli Ticket.confirmed == false, to jest to rezerwacja, a jeśli true, to pełnoprawny bilet.[/quote]
Albo wykorzystać maszynę stanową lub STI. Możliwości jest mnóstwo, nie wiadomo tylko co chcemy uzyskać ;-).

Chce mieć dwa modele, choćby dla counter cache
W momencie opłacenia rezerwacji powstaje bilet, łatwiej zliczyć istniejące bilety i rezerwacje przez counter cache w modelu event. Niż klepać sumy z warunkami. (tak mnie się przynajmniej zdaje :slight_smile:

rozwiązanie @qoobaa działa super

ticket.attributes = reservation.attributes

wielkie Bóg zapłać

w modelu np.

class Orders << ActiveRecord::Base named_scope :tickets, :conditions => "paid = 1" named_scope :reservations, :conditions => "paid = 0" end
gdziekolwiek:

[code]Order.tickets.count
Order.reservations.count

Event :has_many :orders

event = Event.orders.tickets.all[/code]
A można pewnie jakoś pobawić się has_many, albo named scopami, zeby pisać Event.tickets.count albo Event.reservations.count
Poza tym masz jeszcze dziedziczenie modeli.

Kopiowanie atrybutów w tym wypadku wydaje mi się nieeleganckie i powolne. IMHO kłóci się to trochę z obiektowością. Pomyśl, czym jest dla Ciebie rezerwacja i co sprawia, że staje się biletem. :wink:

ALe jak ktoś napisał, jest wiele rozwiązań jednego problemu :slight_smile:

Jest jeszcze coś takiego jak default scope