2014-05-02 102 views
2

我有两个型号Post模型和评论model..First如果创建后,将有1后ID,然后同时创造一个评论,我可以使用POST_ID到后给协会之间的关联等于1,但如果我创建的2帖子ID不存在,仍然会继续前进,创造一个评论,但有“零”的ID ..我想,以确保注释将创建只有一个评论相应的post_id存在。validates_associated验证两种模式

class Post < ActiveRecord::Base 
has_many :comments, dependent: destroy 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
    validates_associated: post 
end 

根据我的理解,validates_associated检查post模型中的验证是否在创建评论前通过。澄清我,如果我错了,这将是对于上述方案一个合适的解决方案?

回答

0

你可以做到这一点,以验证post_id

class Comment < ActiveRecord::Base 
    belongs_to :post 
    validates :post_id, :presence => true 
end 
存在

或验证关联,您可以使用

class Comment < ActiveRecord::Base 
    belongs_to :post 
    validates_presence_of :post 
end 
+1

'验证:POST_ID,存在:TRUE'采取任何价值,打造一个评论,但'证实:帖子,存在:TRUE'工作正常 – Rajanand02

+0

是的,这只是另一种选择:) – RSB

1

首先,设置关联的B/W后的首选方式这里的评论是:

def new 
    @product = Product.first 
    @comment = @product.comments.build 
end 

def create 
    @product = Product.find(params[:comment][:post_id]) 
    @comment = @product.comments.create(comment_params) 
end 

对于你的特定场景,我假设post_id在PARAMS通过某种形式的东西来了,然后你想创建仅与特定post_id后存在的注释。这可以通过在Comment模型添加应做到以下几点:

validates :post, presence: true, allow_blank: false 

OR

validate :post_presence, on: :create 
def post_presence 
    errors.add(:post_id, "Post doesn't exist") unless Post.find(post_id).present? 
end 

你甚至可以做同样的事情在控制器端与before_action/before_filter挂钩。