正确的ROR模型回调用于创建关联

时间:2013-04-16 07:26:13

标签: ruby-on-rails ruby

我在Rails 3 app中关联了模型UserChannelChannel是在User创建

时创建的
class User < ActiveRecord::Base
  before_create do
    self.channels.build
  end
  has_many :channels  
end    

class Channel < ActiveRecord::Base
  belongs_to :user
  validations block
  ...
end

问题是,如果Channel的验证不会通过User,则会在数据库中创建,Channel则不会。在一个'交易'中创建ChannelUser的回调地点Channel创建?或者,也许还有另一种正确的方法吗?

提前致谢。

UPD1: Channel创建放置在模型中的User自动创建,因为在某些情况下创建的对象不会调用控制器。

3 个答案:

答案 0 :(得分:2)

您可以使用“accepts_nested_attributes_for”

class User&lt;的ActiveRecord :: Base的
  has_many:频道
  accepts_nested_attributes_for:channels
结束

类频道&lt;的ActiveRecord :: Base的
        belongs_to:用户
  验证块

答案 1 :(得分:1)

使用validates :channels, associated: true

您应该检查一下您的频道验证,因为如果它没有保存,那么您正在做一些您的应用不期望的事情。

答案 2 :(得分:1)

你想的太多了。这是非常常见的情况,并且有一个惯例。

首先在Pedro说,你需要验证Channel模型中的关联。这将阻止在没有user_id的情况下保存频道。

然后,在控制器的create操作中,您只需确保包含用户对象在内的所有参数都被发送到此处进行创建。