[英]Rails best practice for creating a model during the creation of a separate model
因此,我有兩個模型: User
和Group
。
User belongs_to :group
和
Group has_many :users
。
創建新User
,我想檢查一個已經創建的Group
並分配它們,或者根據用戶提供的信息創建一個新Group
。 Group.find_or_create_by_name("Name")
似乎是執行此操作的好方法,但我的問題是,此文件應位於何處? 我猜想在“胖模型,瘦控制器”之后,它應該在user.rb
。 如果在模型中,那么在創建用戶時傳遞用戶提供的字符串的最佳方法是什么? 我應該在user.rb
設置一個方法,然后在users_controller.rb
調用該方法嗎?
我猜一個相關的問題:我知道我的架構應該反映
create_table "users" do |t|
t.integer "group_id"
為了查詢的目的。 Rails如何“自動”鏈接這些鏈接? 創建Group
模型時,我猜測它需要有一個string:id
列,而Rails只是將兩者鏈接在一起?
很抱歉,我對關聯的明顯缺乏了解,但是我正試圖不要僅僅將某些東西混為一談就很尷尬,並且想確保自己了解最好的解決方法。
首先,根據您所寫的內容,一個組中可以有多個用戶,但是一個用戶只能屬於一個組。
通常,一個組可以有多個成員,而一個用戶可以是多個組的成員。 為此,您可以創建一個稱為membership
的關聯模型。
因此,您的用戶模型具有:
has_many :memberships
has_many :groups, :through => :memberships
您的小組模型有:
has_many :memberships
has_many :members, :through => memberships
關聯將單獨擁有一個表,該表將類似於:
create_table "memberships" do |t|
t.integer "group_id"
t.integer "user_id"
t.timestamps
end
add_index :memberships, :group_id
add_index :memberships, :user_id
為了回答您的原始問題,如果無論用戶的創建方式如何,都必須在創建用戶時創建一個組,那么我將在用戶模型中創建一個Active Record回調:
after_create :create_group
def create_group
# whatever logic and create group
end
有關Active Record回調的更多信息,請參見http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
如果您要創建的組與在表單(視圖)中輸入的信息相關,並且與用戶不直接相關,則必須在控制器中創建組。 就像是 :
def create
@group = Group.build(params[:group])
@group.save!
@user = User.build(params[:user])
@user.group_id = @group.id
@user.save!
end
或者,更干凈的方式:
def create
@group = Group.build(params[:group])
@group.save!
@user = @group.users.build(params[:user])
@user.save!
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.