Sunday, February 05, 2006

Update with ActiveRecord

ช่วงนี้เริ่มใช้ Rails มากขึ้น ก็เลยเริ่มมองเห็นภาพต่างๆชัดขึ้น
ลองดูวิธีการ 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 ตรงๆเลย

Related link from Roti

No comments: