簡體   English   中英

在創建單獨模型期間創建模型的Rails最佳實踐

[英]Rails best practice for creating a model during the creation of a separate model

因此,我有兩個模型: UserGroup

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM