我需要一些关于多态关联的帮助。以下是我的结构:
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创建表单,在查看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
我设法得到了一些工作,但我仍然不确定它是否正确。以下是Create
和Update
操作的更新代码。很高兴知道是否有更好的方法来做到这一点?
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