【问题标题】:Ruby on Rails has_many :through Association controllerRuby on Rails has_many:通过关联控制器
【发布时间】:2016-04-03 20:54:27
【问题描述】:

这是我的 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.

这是当前用户:

 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' 。

我有两个问题:

1- 我如何编写我的创建控制器?

2-如何根据患者检索我的治疗方法。我应该在患者的“显示”方法中定义什么变量来检索其治疗方法?

【问题讨论】:

  • 你应该在treatments 表中有user_id
  • 使用迁移添加user_id,正如@Pavan 之前在评论中所写,您可以使用add_reference :treatments, :user, index: true 之类的参考。
  • 用户是病人吗?
  • 您需要添加一列,映射模型之间的关系。定义索引也是一件好事,这样可以加快对应表项的查找速度。

标签: ruby-on-rails ruby ruby-on-rails-4 has-many-through


【解决方案1】:

当您说User has_many :treatmentsTreatment belongs_to :user 时,两个关联都希望在您的treatments 表中找到user_id 列。您可能希望更改迁移以包括:

t.integer :user_id

然后删除您的表(如果它们还没有数据!)并重新运行迁移。或者,您可以创建一个新的迁移并简单地运行它:

    add_column :treatments, :user_id, :integer

【讨论】:

  • 你可能想添加一个索引,我也建议使用add_reference
  • 我认为用户是一个病人 - 所以也许 has_many :patients, foreign_key: "user_id"。
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 2012-06-12
  • 2010-12-28
  • 2011-01-13
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多