1

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

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 创建我的表单,当查看参数时,我得到以下信息:

{"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[:categorisation]value 需要做的是将数字保存到tableCategorisations.category_id列中,同时保存多态关联。该表将用于其他模型,这也将是一个has_one关联,因为用户将只能为每条记录选择一个类别。我真的希望有人可以在这里帮助我,因为我研究得越多,我就越感到困惑:S 如果您需要我提供更多信息,请告诉我。

我正在使用 Rails 4 和 Ruby 2

编辑 2

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

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
4

0 回答 0