加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 一次创建多个多态记录

发布时间:2020-12-16 19:04:54 所属栏目:百科 来源:网络整理
导读:我有与此处描述的完全模式相同的多态连接表: http://aaronvb.com/articles/a-polymorphic-join-table.html class Location ActiveRecord::Base has_many :note_joins,as: :notable has_many :notes,through: :note_joinsendclass Checkpoint ActiveRecord::
我有与此处描述的完全模式相同的多态连接表: http://aaronvb.com/articles/a-polymorphic-join-table.html
class Location < ActiveRecord::Base
  has_many :note_joins,as: :notable
  has_many :notes,through: :note_joins
end

class Checkpoint < ActiveRecord::Base
  has_many :note_joins,through: :note_joins
end

class NoteJoin < ActiveRecord::Base
  belongs_to :notable,polymorphic: true
  belongs_to :note
end

class Note < ActiveRecord::Base
  attr_accessible :content,:user_id
  belongs_to :notable,polymorphic: true
  belongs_to :user

  has_many :note_joins
end

我希望能够一次创建和更新多种类型的多态关联,而不必执行@ note.locations<< Location.first或@ note.checkpoints<< Checkpoint.first. 像@ note.create note_joins_params和@ note.update note_joins_params这样的东西真棒. 到目前为止,我能够实现创建部分的方法是将一组属性传递给@ note.note_joins.create,例如: :

note_joins_params = [{"notable_id"=>"9225","notable_type"=>"Location"},{"notable_id"=>"9220","notable_type"=>"Checkpoint"}]
@note.note_joins.create note_joins_params

是否有更多的Rails方式来实现这一点,或者类似于accepts_nested_attributes或类似的适当属性哈希语法?

我知道如何进行更新的唯一方法是首先删除连接表中的所有现有记录,然后重新创建它们,即

@note.note_joins.destroy_all
new_note_joins_params = [{"notable_id"=>"9225","notable_type"=>"Checkpoint"}]
@note.note_joins.create new_note_joins_params

解决方法

对于您想要完成的任务,如果您未指定source_type,则Rails实际上没有接受嵌套属性的“smart_way”.请参阅此 The other side of polymorphic :through associations

但你可以试试这个:

class Location < ActiveRecord::Base
  has_many :note_joins,through: :note_joins

  accepts_nested_attributes_for :notes
end

class Checkpoint < ActiveRecord::Base
  has_many :note_joins,through: :note_joins

  accepts_nested_attributes_for :notes
end

class NoteJoin < ActiveRecord::Base
  belongs_to :notable,polymorphic: true
  belongs_to :note

  accepts_nested_attribute_for :note
end

class Note < ActiveRecord::Base
  attr_accessible :content,:user_id
  belongs_to :user

  has_many :note_joins
  # add these,otherwise you won't be able to do nested attributes
  # refer to the blog post I link above.
  has_many :locations,through: :note_joins,source: :notable,source_type: 'Location'
  has_many :checkpoints,source_type: 'Checkpoint'
end

然后在你的表单中,构建这样的东西:

# In your form

# if you want to create from the note,do this
<%= form_for @note do |f| %>
  <%= f.text_field :some_note_field %>
  <%= text_field_tag 'note[locations_attributes][][some_location_field]' %>
  <%= text_field_tag 'note[checkpoints_attributes][]some_checkpoint_field]' %>
<% end %>

# if you want to create from the location/checkpoint,do this.
<%= form_for @location do |f| %>
  <%= f.text_field :name %>
  <%= text_field_tag 'location[notes_attributes][][body]' %>
<% end %>


# In your Location/Checkpoint controllers

def create
  @location = Location.create(location_params)
  redirect_to @location
end

def location_params
  params.required(:location).permit(:name,notes_attributes: [:body])
end

# In your Note controller
def create
  @note = Note.create(note_params)
  redirect_to @note
end

def note_params
  # the goal here is to create a set of params like this
  # { note_field: 'foobar',#   locations_attributes: [{name: 'somewhere'}],#   checkpoints_attributes: [{description: 'lol'}] }
  params.required(:note).permit(:note_field,locations_attributes: [:location_field],checkpoints_attributes: [:checkpoint_field])
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读