ลองดูวิธีการ update ของ ActiveRecord
ลองเทียบดูกับ Hibernate แล้วกัน
กรณี hibernate เราสามารถเลือก update model ได้ 2 แบบหลักๆคือ
- วิธีที่ 1
User user = session.load(User.class, id);
user.setName(newName);
session.update(user); // or session.flush(); - วิธีที่ 2
String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
ใน ActiveRecord เราสามารถ update model ได้ 3 แบบ
- วิธีที่ 1
user = User.find(id)
user.setName(newName)
user.save - วิธีที่ 2
user = User.find(1)
user.update_attrubites("name"=>newName, ...) - วิธีที่ 3
User.update(id, :name=>newName} - วิธีที่ 4
User.update_all("name = '#{newName}'", "id = #{id}")
วิธีที่ 2 นี้เป็นวิธีที่ scaffold generate ออกมาให้
วิธีที่ 4 update เป็น set ได้ (เนื่องจากกำหนด where clause เอง)
วิธีที่ 2 กับ 3 ดูเหมือนๆกัน ต่างกันแค่อันหนึ่งเป็น class method อีกอันเป็น instance method
ซึ่งผมก็เดาว่า 2 วิธีนี้ น่าจะ share ใช้ source code ชุดเดียวกัน
แต่เปล่าเลย วิธีที่ 2 กับ 3 มี source code คนละชุด คนละ idea กันเลย
วิธีที่ 2 จะมีการ set structure ภายในบางอย่าง แล้วค่อยเรียก save method
ส่วนวิธีที่ 3 ใช้วิธีสร้าง sql ขึ้นมาแล้ว execute ตรงๆเลย
No comments:
Post a Comment