association/relationship ใน ActiveRecord

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

ตอนนี้เขียนแล้วงง ๆ
คือใส่โค้ดลงไปเองใน controller เลย update อันนั้นอันนี้
แต่คิดว่ามันน่าจะอยู่ใน model มากกว่า - แต่ใช้ ActiveRecord ไม่เป็น

สมมติว่าผมมี

message อยู่ชุดนึง เอาเป็นว่าจะทำเว็บบอร์ดละกัน

ทีนี้เนี่ย ผมไม่อยากให้ message มันเก็บตัวเนื้อข้อความจริง ๆ ไว้เอง
ทำนองว่าคิดมาก อยากจะเวียนใช้ตัวเนื้อความ เผื่อจะประหยัดที่
(ทำนอง String ใน JVM)

ตัวอย่างเช่นผมมีสองตาราง

message { id, textbody_id }

textbody { id, content }

มีข้อมูล
message[1] = "สวัสดี"
message[2] = "สวัสดี"

อยากให้ textbody_id ในทั้ง message[1] และ [2] เนี่ย มันเป็นตัวเดียวกัน
อาจจะเป็น 109

message[1] = 109
message[2] = 109
textbody[109] = "สวัสดี"

ลองใช้ has_one :textbody ใน message
กับ belongs_to :message ใน textbody
แต่แบบนี้มันก็กลายเป็น 1:1 สิ

ผมไปดูตัวอย่างมาจาก Wikipedia น่ะครับ เค้าใช้แบบนี้
แต่ละ page เก็บ revision_id ล่าสุด,
แต่ละ revision เก็บ text_id,
โดย text เก็บ ข้อความจริง ๆ
(เค้ามี revision ด้วยเพราะว่าจะทำประวัติ)

แต่ไม่รู้จะทำเป็น ActiveRecord ยังไงดี - -"

class Revision < ActiveRecord::Base
  belongs_to :content
end
class Content < ActiveRecord::Base
  has_many :revisions
end

Note: ขอเปลี่ยนชื่อจาก text เป็น content เพราะกลัว 'text' เป็น reserved word ของ database

table ก็หน้าตาแบบนี้

mysql> SELECT * FROM contents;
+----+-------+
| id | msg   |
+----+-------+
|  1 | hello | 
+----+-------+
1 row IN SET (0.01 sec)
 
mysql> SELECT * FROM revisions;
+----+------+------------+
| id | name | content_id |
+----+------+------------+
|  1 | 1.0  |          1 | 
|  2 | 2.0  |          1 | 
+----+------+------------+
2 rows IN SET (0.01 sec)

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น