簡體   English   中英

Ruby on 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

這是我的治療表:

  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-如何基於患者檢索治療方法。我應該在患者的“顯示”方法中定義什么變量以檢索其治療方法?

當你說User has_many :treatmentsTreatment belongs_to :user ,這兩個協會都希望找到一個user_id在列treatments表。 您可能需要更改遷移以包括:

t.integer :user_id

然后刪除表(如果還沒有數據!),然后重新運行遷移。 另外,您可以創建一個新的遷移並簡單地運行它:

    add_column :treatments, :user_id, :integer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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