RubyonRails无法保存has_many关系

时间:2017-05-30 12:17:41

标签: ruby-on-rails rails-activerecord

我有两个模型industry_matcherstaffroom

Model IndustryMatcher

class IndustryMatcher < ActiveRecord::Base    
  has_many :industries, class_name: 'Staffroom', conditions: ["staffroom_type = 'Industry'"]

Model Staffroom

class Staffroom < ActiveRecord::Base
  has_many :industry_matchers

现在我已经创建了一个ActiveAdmin资源,它基本上是一个表单,其中包含用户可以从select2字段中选择的名称和行业。

ActiveAdmin.register IndustryMatcher do
  config.sort_order = 'name_asc'
  menu :parent => 'Job Networks', :label => 'Industry Matcher'


  form do |f|
    f.semantic_errors *f.object.errors.keys
    f.inputs 'Industry' do
      f.input :name
      f.input :industries, :include_blank => false, :as => :select, :multiple => true, :input_html => {class: "chzn-select"}, collection: Staffroom.industry
      end
      f.actions
  end

end

我可以保存模型IndustryMatcher的数据,但这种关系根本没有保存。

这是链接两个

的模型类
class IndustryMatcherStaffroom < ActiveRecord::Base
  attr_accessible :industry_id, :staffroom_id

  belongs_to :industry_matcher
  belongs_to :staffroom
end

如果有人能告诉我这里缺少什么,以及为什么这种关系不会得到保存,我将非常感激。

当我尝试编辑时保存记录后,我看到以下错误

  

ActiveRecord :: StatementInvalid at / admin / industry_matchers / 11 / edit   PG :: UndefinedColumn:错误:列staffrooms.industry_matcher_id   不存在第1行:......确保“在哪里”员工室“。”删除“=   'f'和'员工室......                                                                ^:选择“staffrooms”。来自“staffrooms”所在的“staffrooms”。“已删除”   ='f'和“staffrooms”。“industry_matcher_id”= 11 AND(staffroom_type ='Industry')

1 个答案:

答案 0 :(得分:0)

您的关联不完整,您必须使用has_many through:告诉您的模型使用联接表,如下所示:

class IndustryMatcher < ActiveRecord::Base
  has_many :industry_matcher_staffrooms 
  has_many :industries, through: :industry_matcher_staffrooms, class_name: 'Staffroom', conditions: ["staffroom_type = 'Industry'"]

class Staffroom < ActiveRecord::Base
  has_many :industry_matcher_staffrooms
  has_many :industry_matchers, through: :industry_matcher_staffrooms

由于您未指定模型使用连接表(即IndustryMatcherStaffroom模型),因此rails将您的关联视为一对多连接,并查找相关内容industry_matcher_id表中的id(即staffrooms),因此错误:

PG::UndefinedColumn: ERROR: column staffrooms.industry_matcher_id does not exist 

您可以在Rails guides中了解有关关联的更多信息。