下午好。我是 Rails 新手,我正在使用谷歌翻譯在這里用英文發布,如果它不是很容易閱讀,很抱歉。
我的問題是,我有一個用戶表和一個設定表。
它們是相關的(但我不知道關系是否正確),它們甚至可以確認我,我想知道是否:創建用戶時,我想自動更改“電子郵件”和“推送”該用戶的設定表的欄位為真。是否可以通過用戶模型中稱為“setting_default”的方法來實作?
- 用戶模型。
class User < ApplicationRecord
has_one :setting
before_save :setting_default
def setting_default
self.setting.update(:email, 'true')
self.setting.update(:push, 'true')
end
- 設定模型
class Setting < ApplicationRecord
has_one :user
end
控制器是正常的,如果你需要,我可以放在帖子里
我的遷移:
class CreateSettings < ActiveRecord::Migration[6.0]
def change
create_table :settings do |t|
t.boolean :email, default: true
t.boolean :push, default: true
t.timestamps
end
end
end
class AddSettingsToUser < ActiveRecord::Migration[6.0]
def change
add_reference :users, :setting, null: true, foreign_key: true
end
end

uj5u.com熱心網友回復:
谷歌翻譯在這里很適合你。
首先,您需要將Setting模型更改為屬于User:
class Setting < ApplicationRecord
belongs_to :user
end
您的settings資料庫表缺少user_id將設定與用戶聯系起來的欄位。我不習慣這種add_reference技術,所以我只是在遷移中自己做事。這會起作用:
class CreateSettings < ActiveRecord::Migration[6.0]
def change
create_table :settings do |t|
t.integer :user_id
t.boolean :email, default: true
t.boolean :push, default: true
t.timestamps
end
end
end
(請注意,您的users資料庫表有一個不需要的欄位setting_id。我認為它不應該存在。我會洗掉它。除非它是我不習慣的 Rails 6 東西。)
接下來,如果保存成功(而不是如果失敗),則分配值可能會更好,因此您需要一個after_save。我正在簡化你的價值分配,以防你在那里遇到問題:
class User < ApplicationRecord
has_one :setting
after_save :setting_default
def setting_default
setting.email = true
setting.push = true
setting.save(validate: false)
end
private :setting_default
并且回答似乎是您的問題,是的,您嘗試做的事情應該很容易實作。這是很常見的事情。它應該作業。
uj5u.com熱心網友回復:
當您使用一對一關聯時,您需要has_one在一個模型和belongs_to另一個模型中進行選擇
語意上用戶有一個設定,但沒有設定有一個用戶
所以最好把它們倒過來
要更改您的架構,您需要撰寫新的遷移
class ChangeOneToOneDirection < ActiveRecord::Migration[6.0]
def up
change_table :settings do |t|
t.belongs_to :user, foreign_key: true, null: false
end
User.where.not(setting_id: nil).find_each |user|
Setting.find(user.setting_id).update_columns(user_id: user.id)
end
change_table :users do |t|
t.remove :setting_id
end
end
def down
add_reference :users, :setting, null: true, foreign_key: true
Setting.find_each do |setting|
User.find(setting.user_id).update_columns(setting_id: setting.id)
end
change_table :settings do |t|
t.remove :user_id
end
end
end
遷移后,您可以更改用戶模型
class User < ApplicationRecord
has_one :setting
after_commit :setting_default
private
def setting_default
setting&.update(email: true, push: true)
end
end
僅當保存在資料庫中時才更新關聯模型會更好。并且用戶不能設定。這就是為什么after_commit和安全導航器&
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/482376.html
上一篇:匹配函式Ruby的正則運算式
