gpt4 book ai didi

ruby-on-rails-3 - 使用 collection_singular_ids=ids 方法时,Rails 3 无法对持久对象执行验证

转载 作者:行者123 更新时间:2023-12-04 17:48:00 24 4
gpt4 key购买 nike

有没有办法避免在分配集合属性时自动保存对象(collection_singular_ids=ids 方法)?

例如,我有以下测试和包模型,包有很多测试。用户可以构建具有测试数量的包包。

# test.rb
class Test < ActiveRecord::Base
end

# package.rb
class Package < ActiveRecord::Base
has_many :package_tests
has_many :tests, :through => :package_tests
belongs_to :category

validate :at_most_3_tests

private
# tests count will differ depends on category.
def at_most_3_tests
errors.add(:base, 'This package should have at most three tests') if test_ids.count > 3
end
end

# package_test.rb
class PackageTest < ActiveRecord::Base
belongs_to :package
belongs_to :test

validates_associated :package
end

当包对象为 时,验证没有问题新品 .
1.9.2 :001> package = Package.new(:name => "sample", :cost => 3.3, :test_ids => [1,2,3,4])
=> #<Package id: nil, name: "sample", cost: 3.3>
1.9.2 :002> package.test_ids
=> [1, 2, 3, 4]
1.9.2 :003> package.save
=> false
1.9.2 :004> package.save!
ActiveRecord::RecordInvalid: Validation failed: This package should have at most three tests
1.9.2: 005> package.test_ids = [1,2]
=> [1, 2]
1.9.2 :005> package.save!
=> true

但是我无法使用 命中 at_most_3_tests 方法坚持 包对象。

分配测试ID时立即创建连接表记录
1.9.2: 006> package
=> #<Package id: 1, name: "sample", cost: 3.3>
1.9.2: 007> package.test_ids
=> [1,2]
1.9.2: 007> package.test_ids = [1,2,3,4,5]
=> [1,2,3,4,5]
1.9.2: 008> package.test_ids
=> [1,2,3,4,5]

客户端要求是下拉界面,用于选择包形式的多个测试
并且还使用了 select2用于下拉的 jquery 插件。 Rhmtl 代码看起来像
<%= form_for @package do |f| %>
<%= f.text_field :name %>
<div> <label>Select Tests</label> </div>
<div>
<%= f.select "test_ids", options_for_select(@tests, f.object.test_ids), {}, { "data-validate" => true, :multiple => true} %>
</div>



请帮我解决这个问题。

最佳答案

对于限制数量的关联

您可以使用以下验证代替您的方法:

has_many :tests, :length => { :maximum => 3 }

用于使用多选

我之前有过这个问题,我使用以下代码解决了它:
<%= f.select(:test_ids, options_from_collection_for_select(@tests, :id, :name,  @promotion.test_ids), {}, {multiple: true, "data-validate" => true}) =>

我想 options_from_collection_for_select , 从此 link 阅读帖子示例的类别可能会帮助你。

用于验证

我用过 validates_associated ,如下:
 validates_associated :tests

获取持久化对象的旧属性

您可以使用 reload事件记录如下:
1.9.2: 006> package
=> #<Package id: 1, name: "sample", cost: 3.3>
1.9.2: 007> package.test_ids
=> [1,2]
1.9.2: 007> package.test_ids = [1,2,3,4,5]
=> [1,2,3,4,5]
1.9.2: 007> package.reload
=> #<Package id: 1, name: "sample", cost: 3.3>
1.9.2: 008> package.test_ids
=> [1,2]

或者你可以检查包对象的验证,如果它是假的重新加载它:
unless package.valid?
package.reload
end

关于ruby-on-rails-3 - 使用 collection_singular_ids=ids 方法时,Rails 3 无法对持久对象执行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26611962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com