我的对象 Item
的多态关联为 element
(可以是视频,文字等)
当我想要更新 Item
(及其 element
)时,我会这样做:
@item.update_attributes(param_update_item)
我称之为:
def param_update_item
params.permit(:name, :visible, :title, element: [:content, :url, :html])
# params.permit(:name, :visible, :title) # - don't get error, but obviously don't ubdate the element
end
允许的参数很好,但是当调用update_attributes
时,我收到错误:
undefined method `primary_key' for ActionController::Parameters:Class
有什么想法吗?
编辑:
class Item < ActiveRecord::Base
belongs_to :element, :polymorphic => true, dependent: :destroy
end
module Element
included do
has_one :item, :as => :element, dependent: :destroy
end
end
和模型的例子(在我的例子中)
class Texte < ActiveRecord::Base
include Element
validates :content, :presence => true
end
我在DB中的项目:
class Item < ActiveRecord::Base {
:id => :integer,
:element_id => :integer,
:element_type => :string,
.... }
当我item.element
时,我得到:
=> <Texte id: 15757, content: "RE3 3232 /...", created_at: ...>
答案 0 :(得分:0)
如果要使用项目更新元素,则应告诉模型您的项目应接受元素的嵌套属性。
module Element
included do
has_one :item, :as => :element, dependent: :destroy
accepts_nested_attributes_for :element
end
end
但我认为您的关系设置可能不正确。你说你希望你的元素是多态的,但你的项目只属于元素。
我愿意
class Item < ActiveRecord::Base
belongs_to :element
end
class Element < ActiveRecord::Base
has_one :item
belongs_to :elementable, polymorphic: true
validates :content, presence: true
end
module Elementable
extend ActiveSupport::Concern
included do
has_one :element, as: :elementable
accepts_nested_attributes_for :element
end
end
class Texte < ActiveRecord::Base
include Elementable
end
然后在您的项目更新中,您可以允许
element_attributes: [# all your element attributes in here]
这将要求您将项目表更改为具有element_id并在迁移中添加元素表
create_table :elements do |t|
t.belongs_to :elementable, polymorphic: true
end
这将创建名为elementable_type和elementable_id
的列我会阅读此内容以获取更多信息Polymorphic Associations