2016-04-11 19 views
0

私はRails 4.2を使用していますが、最近私のモデルでhas_manyという関係を使って試してみました。私は、レコードを更新し、それをどのように処理するのか分からない問題に直面しています。 私は名前がnilすることはできませんので、検証に失敗し、以下のコードRails - has_manyを使ってリレーションを保存し、親を保存せずに保存しました

@post = Post.find(1) 
@post.name = nil 
@post.tags_used = ["rails","ruby"] 
@post.save 

ポストを通じて既存のポストを更新する場合は、以下を検討し、私のモデル今

class Post < ActiveRecord::Base 
    attr_accessor: name 

    validates :name, :presence => true 
    has_many :post_tags 
    has_many :tags, :through => :post_tags, :autosave => false 

    def tags_used 
    self.tags.collect(&:name).join(',') 
    end 

    def tags_used=(list) 
    self.tags = list.present? ? Tag.where(:name => list.split(/\s*,\s*/)) : [ ] 
    end 
end 

class Tag < ActiveRecord::Base 
    has_many :post_tags 
    has_many :posts, :through => :post_tags 
end 

class PostTag < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

です。しかし、post_tagレコードは保存されています。

私は< <を試して、=のかわりに置き換えましたが、役に立たなかったです。あなたがトランザクション内でこのコードをラップする必要がポストレコードが

答えて

0

保存されている場合にのみpost_tagレコードが保存されていることを確認する方法

@post = Post.find(1) 
@post.name = nil 
@post.transaction do 
    @post.tags_used = ["rails","ruby"] 
    raise ActiveRecord::Rollback unless @post.save 
    # or just @post.save! 
end 
+0

@faronに感謝します。私は取引を確認します。しかし、<<とautosave => falseの使用は何か –

+0

Autosaveは、 'parent.save'が呼び出されたときに、ロードされたレコードに対して' save'を呼び出します。 Ex。 'post = Post.first; post.tags.to_a; post.save'は各タグに対して 'save'を呼び出します。感謝@edvin。 – faron

0

あなたが self.tagsを使用する場合= [TagsCollection]またはself.tags < <タグ これは直接ポストに関連するタグを保存します。したがって、あなたのタグはここに保存されます。

@ post.saveを呼び出すと、検証が実行され、エラーが表示されます。

この場合、ネストされた属性を使用するか、self.tags.buildを使用して、親が保存されるときにタグが保存されるようにすることができます。

関連する問題