Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 有很多:通过子验证和父验证_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby 有很多:通过子验证和父验证

Ruby 有很多:通过子验证和父验证,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我有一个rails 3.0 已经设置了很多:X,:到=>:一些东西,我有一个自定义验证器,可以对一些复杂的逻辑进行自定义验证。我想知道,当你向这个多对多关系中添加任何东西时,两个模型都有效吗 项目类别: class Project < ActiveRecord::Base has_many :assignments has_many :users, :through => :assignments validates :name, :presence => tru

我有一个rails 3.0 已经设置了很多:X,:到=>:一些东西,我有一个自定义验证器,可以对一些复杂的逻辑进行自定义验证。我想知道,当你向这个多对多关系中添加任何东西时,两个模型都有效吗

项目类别:

class Project < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments

  validates :name, :presence => true
end
class项目:分配
验证:name,:presence=>true
结束
任务:

class Assignment < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
end
类分配
具有自定义验证器的用户类:

class MyCustomValidator < ActiveModel::Validator
  def validate( record )
    if record.projects.length > 3
      record.errors[:over_worked] = "you have to many projects!"
    end
  end
end

class User < ActiveRecord::Base
  has_many :assignments
  has_many :projects, :through => :assignments

  validates :name, :presence => true
  validates_with MyCustomValidator
end
类MyCustomValidator3
record.errors[:over_worked]=“您必须完成许多项目!”
结束
结束
结束
类用户:作业
验证:name,:presence=>true
使用MyCustomValidator验证_
结束
我真正想做的是防止每个模型使另一个失效 阻止

my_user.projects
class项目:分配
验证:name,:presence=>true
验证关联的用户
结束
根据文档,用户必须已经被分配到项目中才能进行验证。因此:

my_user.projects << fourth_project

my_user.projects仅供参考,另一种方法是用户接受_嵌套的_属性,iirc已经为其验证关联对象,并且您可以传入以下选项:limit=>3irb(main):001:0>bob=user.find(1)=>#irb(main):002:0>bob.projects=>[#,#,#]irb(main):003:0>bob.valid?=>真irb(主):004:0>project4=Project.find(4)=>#irb(主):005:0>project4.users=>[]irb(主):006:0>project4.users[#]irb(主):007:0>project4.valid?=>真实irb(主):008:0>bob.valid?=>trueOops,当我重新加载时,它会变得更为bizare irb(主):009:0>project4.save=>true irb(主):010:0>project4.reload=>#irb(主):011:0>project4.valid?=>假irb(主):012:0>bob.reload=>#irb(主):013:0>bob.valid?=>falseErr为这篇糟糕的帖子感到抱歉,这似乎有点奏效了,我想迫不及待的加载在某种程度上折磨着我。如果在再次分配任务之前未调用user.projects,则可能需要尝试接受\u嵌套的\u属性\u,以确定它是否适合您正在执行的操作。这样做的好处是,您可以在没有自定义验证的情况下设置限制
my_project.users << user_with_four_projects_already
class Project < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments

  validates :name, :presence => true
  validates_associated :users
end
my_user.projects << fourth_project