Rails 之旅第 2 天:Rails 關聯和拖動 div
大家好!今天是我搭建這個玩具項目的第 2 天。下面再來記錄一下關於 Rails 的一些有趣的事情吧!
目標:做一個冰箱詩歌論壇
我想做一種無聊的標準網站來學習 Rails,並且其他人可以與之互動,就像一個論壇一樣! 但如果人們真的可以在網站上打字,那就會產生各種各樣的問題(如果他們是垃圾郵件發送者怎麼辦?又或者只是言語刻薄?)。
我想到的第一個想法是,可以讓人們與網站互動,但實際上卻不能在網站上打字,那就是一個「冰箱詩歌論壇」,只給你一組固定的字,你就可以隨意組合。
所以,這就是我們的計劃!
我這個項目的目標是想知道我是否能用 Rails 來做其他的小型網路項目(而不是像我通常做的那樣,使用一些更基本的東西,比如 Flask,或者放棄後端,用 Javascript 來寫所有東西)。
怎麼把字拖來拖去呢?jQuery 的可拖放 UI!
我想讓大家能夠把文字拖動起來,但我又不想寫很多 Javascript。結果發現這超級簡單 —— 有一個 jQuery 庫可以做到,它叫做 draggable
!一開始,拖動並不成功。
一開始拖動在手機上是不行的,但是有一個技巧可以讓 jQuery UI 在手機上工作,叫做 jQuery UI touch punch。下面是它的樣子(有興趣看工作原理的可以查看源碼,代碼很少)。
banana
forest
cake
is
一個有趣的 Rails 功能:關聯
我以前從來沒有使用過關係型 ORM,對於 Rails,我很興奮的一件事就是想看看使用 Active Record 是什麼樣子的!今天我了解了 Rails 的 ORM 功能之一:關聯。如果你像我一樣對 ORM 完全不了解的話,那就來看看是怎麼回事吧。
在我的論壇中,我有:
- 用戶
- 話題(我本來想把它叫做「線索」,但顯然這在 Rails 中是一個保留詞,所以現在叫做「話題」)。
- 帖子
當顯示一個帖子時,我需要顯示創建該帖子的用戶的用戶名。所以我想我可能需要寫一些代碼來載入帖子,並為每個帖子載入用戶,就像這樣(在 Rails 中,Post.where
和 User.find
將會運行 SQL 語句,並將結果轉化為 Ruby 對象):
@posts = Post.where(topic_id: id)
@posts.each do |post|
user = User.find(post.user_id)
post.user = user
end
這還不夠好,它要為每個帖子做一次單獨的 SQL 查詢!我知道有一個更好的方法,我發現它叫做關聯。這個鏈接是來自 https://guides.rubyonrails.org 的指南,到目前為止,它對我很有幫助。
基本上我需要做的就是:
- 在
User
模型中添加一行has_many :post
。 - 在
Post
模型中添加一行belongs_to :user
。 - Rails 現在知道如何將這兩個表連接起來,儘管我沒有告訴它要連接到什麼列上!我認為這是因為我按照它所期望的慣例命名了
posts
表中的user_id
列。 - 對
User
和Topic
做完全相同的事情(一個主題也有很多帖子:has_many :posts
)。
然後我載入每一個帖子和它的關聯用戶的代碼就變成了只有一行! 就是這一行:
@posts = @topic.posts.order(created_at: :asc).preload(:user)
比起只有一行更重要的是,它不是單獨做一個查詢來獲取每個帖子的用戶,而是在 1 個查詢中獲取所有用戶。顯然,在 Rails 中,有一堆不同的方法來做類似的事情(預載入、急切載入、聯接和包含?),我還不知道這些都是什麼,但也許我以後會知道的。
一個有趣的 Rails 功能:腳手架!
Rails 有一個叫 rails
的命令行工具,它可以生成很多代碼。例如,我想添加一個 Topic
模型/控制器。我不用去想在哪裡添加所有的代碼,可以直接運行
rails generate scaffold Topic title:text
並生成了一堆代碼,這樣我已經有了基本的端點來創建/編輯/刪除主題(Topic
)。例如,這是我的現在的主題控制器,其中大部分我沒有寫(我只寫了高亮的 3 行)。我可能會刪除很多內容,但是有一個起點,讓我可以擴展我想要的部分,刪除我不想要的部分,感覺還不錯。
資料庫遷移!
rails
工具還可以生成資料庫遷移! 例如,我決定要刪除帖子中的 title
欄位。
下面是我要做的:
rails generate migration RemoveTitleFromPosts title:string
rails db:migrate
就是這樣 —— 只要運行幾個命令行咒語就可以了! 我運行了幾個這樣的遷移,因為我改變了對我的資料庫模式的設想。它是相當直接的,到目前為止 —— 感覺很神奇。
當我試圖在一列中的某些欄位為空的地方添加一個「不為空」(not null
)約束時,情況就變得有點有趣了 —— 遷移失敗。但我可以修復違例的記錄,並輕鬆地重新運行遷移。
今天就到這裡吧!
明天,如果我有更多的進展,也許我會把它放在互聯網上。
via: https://jvns.ca/blog/2020/11/10/day-2--rails-associations---dragging-divs-around/
作者:Julia Evans 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive