自定义嵌套属性中的保存

时间:2016-02-26 01:59:03

标签: ruby-on-rails ruby nested-attributes

我有两个班级:

class Post
  has_and_belongs_to_many :receivers
  accepts_nested_attributes_for :receivers
end 

class Receiver
  has_and_belongs_to_many :posts

表模式如下:

posts: id, xxx

receivers: id, email, name, xxxx

posts_receivers: post_id, receiver_id

我几乎遵循这里的指南:http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

因此,在我的post表单中,每个表单都可以包含多个接收者,这些接收者只是几个电子邮件文本字段。从这些电子邮件中自动创建新的接收者记录。会发生不同的post表单有一些现有的电子邮件,然后我不想在receivers表中为现有电子邮件创建新记录。相反,我想找到带有现有电子邮件的接收者ID,并将带有帖子ID的id保存到posts_receivers表中。

现在它只是为新帖子创建新的接收者记录,无论电子邮件是现有的还是新的。

有关如何实施此建议的任何建议?非常感谢!

1 个答案:

答案 0 :(得分:1)

嵌套属性不会为您处理这种情况 - 当嵌套对象属于父对象时,它们更适用于它们。

您可以通过加载控制器中的每个现有接收器,创建其余接收器,然后将它们分配到帖子来手动执行此操作:

def create
  post = Post.new(params[:post])
  post.receivers = params[:receivers].map do |receiver_params|
    Receiver.first_or_create(receiver_params)
  end
  post.save!
end