{"id":2815,"date":"2015-09-26T13:42:18","date_gmt":"2015-09-26T11:42:18","guid":{"rendered":"https:\/\/sgaul.de\/?p=2815"},"modified":"2015-09-25T12:35:40","modified_gmt":"2015-09-25T10:35:40","slug":"activerecord-klasse-einer-model-instanz-aendern","status":"publish","type":"post","link":"https:\/\/sgaul.de\/2015\/09\/26\/activerecord-klasse-einer-model-instanz-aendern\/","title":{"rendered":"ActiveRecord: Klasse einer Model-Instanz \u00e4ndern"},"content":{"rendered":"
ActiveRecord erlaubt das direkte \u00c4ndern\u00a0der Klasse einer Model-Instanz mittels #becomes<\/a>. Dies kann zum Beispiel hilfreich sein, wenn man f\u00fcr einen Spezialfall weitere Funktionen oder Validierungen zu einem Model hinzuf\u00fcgen will:<\/p>\n \u00c4hnliches lie\u00dfe sich zwar auch\u00a0mit bedingten Validierungen erreichen,\u00a0w\u00fcrde aber ab einem gewissen Umfang schlicht nicht mehr skalieren.<\/p>\n Ein weiterer, oft gesehener\u00a0Ansatz w\u00e4re Zum Speichern der Klassen\u00e4nderung kann man #becomes!<\/a> verwenden. Dies passt auch die STI-Vererbungsspalte (in aller Regel type) an.<\/p>\n","protected":false},"excerpt":{"rendered":" ActiveRecord erlaubt das direkte \u00c4ndern\u00a0der Klasse einer Model-Instanz mittels #becomes. Dies kann zum Beispiel hilfreich sein, wenn man f\u00fcr einen Spezialfall weitere Funktionen oder Validierungen zu einem Model hinzuf\u00fcgen will: > company = Company.last > company.persisted? => true > company.valid? => true > company = company.becomes(RestrictedCompany) > company.is_a?(RestrictedCompany) => true > company.is_a?(Company) => true >… ActiveRecord: Klasse einer Model-Instanz \u00e4ndern<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[91],"tags":[597,527,553,552],"_links":{"self":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/2815"}],"collection":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/comments?post=2815"}],"version-history":[{"count":3,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/2815\/revisions"}],"predecessor-version":[{"id":2820,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/2815\/revisions\/2820"}],"wp:attachment":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/media?parent=2815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/categories?post=2815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/tags?post=2815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}> company = Company.last\r\n> company.persisted?\r\n => true\r\n> company.valid?\r\n => true \r\n> company = company.becomes(RestrictedCompany)\r\n> company.is_a?(RestrictedCompany)\r\n => true \r\n> company.is_a?(Company)\r\n => true \r\n> company.persisted?\r\n => true\r\n> company.valid?\r\n => false<\/pre>\n
RestrictedCompany.find(company.id)<\/code>. Dieser ist jedoch von der Datenbank abh\u00e4ngig und somit vermutlich weniger performant. Zudem ben\u00f6tigt er wirklich persistierte Instanzen. Dies\u00a0ist vor allem nervig, wenn man in Tests gerne Stubbing nutzt.<\/p>\n