0
#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;

//发布此问题所需的“质量标准”

4

2 回答 2

1

如果您先保存然后检查,它应该可以工作。

如果你不想坚持它,那么你不应该使用 has_many

只需使用普通的实例变量

class Something 
 attr_accessor :numbers
end
于 2012-12-26T04:55:49.993 回答
0

重要的是永远不要使用Something.all.first,而是使用Something.first. 前者将表中的每条记录加载到内存中,然后取第一个,丢弃其余的。后者加载第一条记录。在大型表上,当您的 Rails 进程占用几 GB 内存时,这将导致非常严重的问题。

如果要选择多个 Number 记录,请按以下方式进行:

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关系意味着 Number belongs_toSomething 。这也意味着 Number 有一个something_id需要操作的列。您在示例中没有对 Number 记录进行任何保存,因此它们可能无法正确关联。我认为 Rails 3 比 Rails 2 处理得更好,表现更接近你的期望。

请记住始终针对重要的数据集测试您的应用程序。生成足够数量的虚假测试数据,以确保您正确处理分页,并且all在开发周期的早期就暴露出诸如调用之类的错误。

唯一all安全使用的情况是,如果您绝对确定列表中的项目数量是可以接受的小。用户提供的数据很少出现这种情况。如果用户可以在列表中拥有一千个项目,那么其中一个可能会。

于 2012-12-26T05:17:02.013 回答