将嵌套属性与保存后获得的ID相关联

时间:2010-12-15 15:16:54

标签: ruby-on-rails

class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts
end

params = { :member => {
  :name => 'joe', :posts_attributes => [
    { :title => 'Kari, the awesome Ruby documentation browser!' },
    { :title => 'The egalitarian assumption of the modern citizen' },
  ]
}}

member = Member.create(params['member'])

执行此操作后,我想在保存后将params散列中的posts_attributes中的元素映射到id(主键)。当accepts_nested_attributes_for构建或创建每条记录时,我能做些什么吗

PS:posts_attributes数组可能不包含序列中的索引我的意思是这个数组可能不包含像0,1,2这样的索引它可以包含索引,如0,127653,7863487,因为我通过javascript动态创建表单元素

另外,我想只关联在Post中创建的新记录而不是现有的Post

先谢谢

2 个答案:

答案 0 :(得分:1)

您是否考虑过刷新posts关联并完全抓取posts_attributes数组?

不幸的是,没有一种可靠的方法来做你想做的事。你可以尝试使用字符串匹配来循环遍历两者并找到与内容相关联的ID,但是如果帖子上没有保证是唯一值的字段,那么就没有一种有效的方法。

答案 1 :(得分:0)

虽然我不太确定你想用什么ID分配哪些元素,但我认为这种方法会给你一个提示。

您可以将方法名称符号分配给:reject_if,然后将您的逻辑放入该方法中,如下所示:

class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts, :reject_if => :reject_posts?

  def reject_posts?(attrs)
    # You can do some assignment here
    return true if attrs["title"].blank?
    post_exist = self.posts.detect do |p|
      p.title == attrs["title"]
    end
    return post_exist
  end
end