顯示具有 model 標籤的文章。 顯示所有文章
顯示具有 model 標籤的文章。 顯示所有文章

2020年2月18日 星期二

Model 中的migration,建立一對一連結,增加欄位

建立User跟Group的連結relationship

$ rails g migration add_user_id_to_group user_id:integer
$ rails db:migrate
ctrl-p>user.rb>has_many :groups
ctrl-p>group.rb>belongs_to :user
ctrl-p>groups_controller.rb>@group.user_id = current_user.id
ctrl-p>app/views/groups/index.html.erb><td><%= group.user.email %></td>
git add .
git ci -am "add relationship in User and Group"

Model中資料關聯的多對多方法/加入社團

https://railsbook.tw/chapters/18-model-relationship.html >>講得很清楚。
https://ihower.tw/rails/activerecord.html
這個Join table筆者的命名習慣會是ship結尾。

加入社團功能

多對多關係

user,group,group_relationship
app/models/user.rb
+  has_many :group_relationships
+  has_many :participated_groups, through: :group_relationships, source: :group

app/models/group.rb
+  has_many :group_relationships
+  has_many :members, through: :group_relationships, source: :user

app/models/group_relationship.rb
+  belongs_to :group
+  belongs_to :user

檢查是否有加入群組

app/models/user.rb
檢查是否有加入群組
+    def is_member_of?(group)
+      participated_groups.include?(group)
+    end

rails c 
u = User.first
g = Group.first
u.is_member_of?(g)
加入群組功能
  def join!(group)
    participated_groups << group
  end
退出群組功能
  def quit!(group)
    participated_groups.delete(group)
  end

HABTM(has_and_belongs_to_many)

這個很猛,不需要另外創資料表。如果你有需要使用這個第三方模型(例如你想知道這筆商品是在什麼時間店放入到商店裡)就不適合了。

傳統的的has_many :products, through: :ware_houses可以加些東西在資料庫裡面。created_at或是updated_at或是scope功能等,尤其scope功能最重要。+>但這個功能我捨棄掉不用,因為還在學習:D

Model中的scope方法,排序,判斷式

https://railsbook.tw/chapters/16-model-basic.html#scope-and-class-method

自己創造scope方法

重點在於將邏輯從controller抽出到model裡面

修改 app/models/post.rb,加入一行 scope :recent, -> { order("created_at DESC")}

app/models/post.rb
class Post < ApplicationRecord
    # ... 略
  scope :recent, -> { order("created_at DESC")}#排序
  scope :available, -> { where(is_available: true) }#is_available
  scope :price_over, ->(p) { where(["price > ?", p]) }#價格是否大於
end

app/controllers/groups_controller.rb
  def show
    @group = Group.find(params[:id])
    @posts = @group.posts.recent >>這樣漂亮乾淨多了
  end

公用的方法

.created_at >何時創建的
.updated_at >何時更新的

cloud9上面開發rails

 使用IAM身分登入,以免有資安問題。(用admin帳號登入,創建iam使用者,然後在上面的連結登入) 選擇 ubuntu18.04 減少查詢成本。 已經是超級使用者了,sudo 什麼都不需要輸入密碼了。 $ ruby -v  檢查 ruby使用的版本>>2.6.3,...