Ruby 在 Rails has_many 上:通过关联控制器
Ruby on Rails has_many :through Association controller
这是我的 3 个模型:
用户型号:
class User < ActiveRecord::Base
has_many :patients, through: :treatments
has_many :treatments
.
.
.
患者型号:
class Patient < ActiveRecord::Base
has_many :user, through: :treatments
has_many :treatments, dependent: :destroy
.
.
.
治疗模型:
class Treatment < ActiveRecord::Base
belongs_to :patient
belongs_to :user
validates :patient_id, presence: true
default_scope -> { order(created_at: :desc) }
end
这是我的治疗方法table :
class CreateTreatments < ActiveRecord::Migration
def change
create_table :treatments do |t|
t.date :teartment_date
t.text :remark
t.float :fee
t.references :patient, index: true, foreign_key: true
t.timestamps null: false
end
add_index :treatments, [:patient_id, :created_at]
end
end
现在我想定义一个控制器来创建属于特定用户患者的新治疗。
这是我的控制器:
def new
@treat = Treatment.new
end
def create
@userpatient = current_user.treatments.build(treat_params)
if @userpatient.save
flash[:success] = "new treatment added"
redirect_to root_url
else
render 'new'
end
end
但这是我收到的错误,而我想创建一个新的治疗方法:
ActiveRecord::UnknownAttributeError in TreatmentsController#create
unknown attribute 'user_id' for Treatment.
这是 current_user :
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
我是 rails 的新手,基本思想是我希望我的用户接受属于特定患者的治疗。
感谢回复,我通过添加参考列解决了这个问题。现在我没有收到,但它不会节省任何治疗。我的意思是:
if @treat.save
flash[:success] = "new treatment added"
redirect_to root_url
else
render 'new'
end
它不保存,只渲染 'new'。
我有 2 个问题:
1- 我如何编写创建控制器的代码?
2- 如何根据 patient.what 变量检索我的治疗 我应该在我的患者 'show' 方法中定义以检索其治疗吗?
当您说 User
has_many :treatments
和 Treatment
belongs_to :user
时,两个协会都希望在您的 [=17] 中找到 user_id
列=] table。您可能希望更改迁移以包括:
t.integer :user_id
然后删除您的 table(如果他们还没有数据!)并重新运行 迁移。或者,您可以创建一个新的迁移,只需 运行 即:
add_column :treatments, :user_id, :integer
这是我的 3 个模型:
用户型号:
class User < ActiveRecord::Base
has_many :patients, through: :treatments
has_many :treatments
.
.
.
患者型号:
class Patient < ActiveRecord::Base
has_many :user, through: :treatments
has_many :treatments, dependent: :destroy
.
.
.
治疗模型:
class Treatment < ActiveRecord::Base
belongs_to :patient
belongs_to :user
validates :patient_id, presence: true
default_scope -> { order(created_at: :desc) }
end
这是我的治疗方法table :
class CreateTreatments < ActiveRecord::Migration
def change
create_table :treatments do |t|
t.date :teartment_date
t.text :remark
t.float :fee
t.references :patient, index: true, foreign_key: true
t.timestamps null: false
end
add_index :treatments, [:patient_id, :created_at]
end
end
现在我想定义一个控制器来创建属于特定用户患者的新治疗。
这是我的控制器:
def new
@treat = Treatment.new
end
def create
@userpatient = current_user.treatments.build(treat_params)
if @userpatient.save
flash[:success] = "new treatment added"
redirect_to root_url
else
render 'new'
end
end
但这是我收到的错误,而我想创建一个新的治疗方法:
ActiveRecord::UnknownAttributeError in TreatmentsController#create
unknown attribute 'user_id' for Treatment.
这是 current_user :
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
我是 rails 的新手,基本思想是我希望我的用户接受属于特定患者的治疗。
感谢回复,我通过添加参考列解决了这个问题。现在我没有收到,但它不会节省任何治疗。我的意思是:
if @treat.save
flash[:success] = "new treatment added"
redirect_to root_url
else
render 'new'
end
它不保存,只渲染 'new'。
我有 2 个问题:
1- 我如何编写创建控制器的代码?
2- 如何根据 patient.what 变量检索我的治疗 我应该在我的患者 'show' 方法中定义以检索其治疗吗?
当您说 User
has_many :treatments
和 Treatment
belongs_to :user
时,两个协会都希望在您的 [=17] 中找到 user_id
列=] table。您可能希望更改迁移以包括:
t.integer :user_id
然后删除您的 table(如果他们还没有数据!)并重新运行 迁移。或者,您可以创建一个新的迁移,只需 运行 即:
add_column :treatments, :user_id, :integer