Rails v.2自定义映射属性到对象

时间:2012-12-26 04:48:57

标签: ruby-on-rails ruby

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

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

2 个答案:

答案 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安全的唯一场合是,如果您绝对确定列表中的项目数量是可以接受的。用户提供的数据很少出现这种情况。如果用户可以在列表中有一千个项目,那么其中一个可能会。