#model
class Something
has_many :numbers
end
#controller
something = Something.all.first
numbers = Number.all
something.numbers = [numbers[0], numbers[4]] # can we do it like this?
puts "something = #{something.inspect}" => <#Something > // with no `numbers` we've set;
//发布此问题所需的“质量标准”
答案 0 :(得分:1)
如果先保存然后检查,它应该可以工作。
如果您不想坚持下去,那么您就不应该使用has_many
只需使用普通的实例变量
class Something
attr_accessor :numbers
end
答案 1 :(得分:0)
从不使用Something.all.first
并使用Something.first
非常重要。前者将表中的每个记录加载到内存中,然后取出第一个,丢弃其余的。后者加载第一条记录。在大型表上,当您的Rails进程占用几千兆字节的内存时,这将导致非常严重的问题。
如果要选择多个数字记录,请按以下方式执行:
numbers = Number.find_all_by_id([ 0, 4 ])
numbers.each do |number|
number.something = something
number.save
end
更高级的方法是:
Number.update_all({ :something_id => something.id }, { :id => [ 0, 4 ] })
始终查看log/development.log
中呈现的查询,以了解ActiveRecord如何解释您的调用。结果可能会令人惊讶,特别是对于那些没有经验的人。
has_many
关系意味着数字belongs_to
某事。它还意味着Number有一个需要操作的something_id
列。您没有在示例中将任何保存到Number记录中,因此它们可能无法正确关联。我认为Rails 3比Rails 2处理得更好,表现得更接近你的预期。
请记住总是根据非平凡的数据集测试您的应用程序。生成足够数量的虚假测试数据,以确保正确处理分页,并且在开发周期的早期就会出现调用all
等错误。
使用all
安全的唯一场合是,如果您绝对确定列表中的项目数量是可以接受的。用户提供的数据很少出现这种情况。如果用户可以在列表中有一千个项目,那么其中一个可能会。