在我的應用程式中,我有User和Language模型。用戶可以有多種語言,一種語言可以有多個用戶。
class Language < ApplicationRecord
has_and_belongs_to_many :users
end
class User < ApplicationRecord
has_and_belongs_to_many :languages
end
我想創建一個表單,允許用戶向組態檔添加新語言。由于User和Language模型都已經存在,我想知道如何創建一個不會創建任何新模型而只是在現有模型之間創建關系的表單。
uj5u.com熱心網友回復:
無論是和的has_many HABTM宏創建_ids和_ids=getter和setter方法,使得它瑣碎副不同的記錄:
<%= form_with(model: @user) do |form| %>
<div class="field">
<%= form.label :language_ids, "Languages" %>
<%= form.collection_select(:language_ids, Language.all, :id, :name, multiple: true) %>
# or if you prefer checkboxes
<%= form.collection_checkboxes(:language_ids, Language.all, :id, :name) %>
</div>
# ...
<% end %>
表單集合助手足夠聰明,可以在整個集合中進行迭代,并將根據關聯是否已存在進行選擇/檢查。
您可以通過將哈希鍵傳遞給permit一個空陣列作為其值來將陣列引數列入白名單:
class UsersController < ApplicationController
def create
@user = User.new(user_params)
# ...
end
private
def user_params
params.require(:user)
.permit(
:foo, :bar, :baz,
langauge_ids: []
)
end
end
如果您想首先使用has_and_belongs_to_many,我也會認真考慮。由于沒有模型,您無法訪問連接表上的任何其他列,例如用戶的熟練程度或他們的主要語言。也沒有直接查詢連接表的直接方法。has_many through:在大多數情況下實際上是更好的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358385.html
