多态关联和额外的id字段

时间:2013-09-26 16:02:53

标签: ruby-on-rails ruby-on-rails-4 polymorphic-associations

我需要一些关于多态关联的帮助。以下是我的结构:

class Category < ActiveRecord::Base
  has_ancestry
  has_many :categorisations
end

class Categorisation < ActiveRecord::Base
  belongs_to :category
  belongs_to :categorisable, polymorphic: true
end

class classifiedAd < ActiveRecord::Base
  belongs_to :user
  has_one :categorisation, as: :categorisable
end

这是我的schema.rb

create_table "classifiedads", force: true do |t|
  t.string   "title"
  t.text     "body"
  t.decimal  "price"
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end
add_index "classifiedads", ["user_id"], name: "index_classifiedads_on_user_id", using: :btree

create_table "categories", force: true do |t|
  t.string   "name"
  t.string   "ancestry"
  t.datetime "created_at"
  t.datetime "updated_at"
end
add_index "categories", ["ancestry"], name: "index_categories_on_ancestry", using: :btree

create_table "categorisations", force: true do |t|
  t.integer  "category_id"
  t.integer  "categorisable_id"
  t.string   "categorisable_type"
  t.datetime "created_at"
  t.datetime "updated_at"
end

似乎关联是正确的,因为当我在控制台中时,我可以执行相应的命令,并且似乎都返回了正确的结果,例如:Category.first.categorisationsClassifedAd.first.categorisation。但我不明白的是保存Create的关联并通过Update操作编辑记录。我正在使用simple_form创建表单,在查看params时,我得到以下内容:

{"title"=>"Tiger",
 "body"=>"Huge Helicopter",
 "price"=>"550.0",
 "categorisation"=>"5"}

并且由于我收到此错误而无法更新甚至创建:Categorisation(#70249667986640) expected, got String(#70249634794540)我的控制器操作代码如下:

def create
  @classified = Classifiedad.new(classifiedad_params)
  @classified.user = current_user
  @classified.save
end

def update
  @classified.update(classifiedad_params)
end

def classifiedad_params
  params.require(:classifiedad).permit(:title, :body, :price)
end

我认为它与params有关,因为分类应该在结果的子哈希范围内,这是对的吗?此外,我需要在行动中做一些额外的事情,但是什么呢? params[:categorisation]值需要做的是将数字保存到Categorisations.category_id表列中,并保存多态关联。此表将用于其他模型,这些模型也将是has_one关联,因为用户只能为每条记录选择一个类别。我真的希望有人可以在这里帮助我,因为我越是调查它就越困惑:S如果你不再了解我的信息,请告诉我。

我正在使用Rails 4和Ruby 2

编辑2

我设法得到了一些工作,但我仍然不确定它是否正确。以下是CreateUpdate操作的更新代码。很高兴知道是否有更好的方法来做到这一点?

def create
  @classified = Classifiedad.new(classifiedad_params)
  @classified.user = current_user

  **** NEW 
  cat = Categorisation.new(category_id: params[:classified][:categorisation])
  @classified.categorisation = cat 
  **** END NEW

  @classified.save
end

def update
  **** NEW
  @classified.categorisation.update_attribute(:category_id, params[:classified][:categorisation])
  **** END NEW

  @classified.update(classifiedad_params)
end

0 个答案:

没有答案