我需要一些有关多态关联的帮助。下面是我的结构:
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.categorisations
或ClassifedAd.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
我设法让一些东西工作,但我仍然不确定它是否正确。以下是Create
andUpdate
操作的更新代码。很高兴知道是否有更好的方法来做到这一点?
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