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 プロセスが数ギガバイトのメモリを占有すると、非常に深刻な問題が発生します。

複数の 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.logActiveRecord が呼び出しをどのように解釈するかを理解してください。結果は、特に初心者にとっては驚くべきものになる可能性があります。

関係とは、何かを数えるというhas_manyことを意味します。また、操作が必要な列がbelongs_toNumber にあることも意味します。something_idこの例では Number レコードへの保存を行っていないため、正しく関連付けられない可能性があります。Rails 3 はこれを Rails 2 よりもはるかにうまく処理し、期待どおりに動作すると思います。

重要なデータセットに対してアプリケーションを常にテストすることを忘れないでください。allページネーションを正しく処理し、呼び出しなどのミスが開発サイクルの非常に早い段階で明らかになるように、十分な量の偽のテスト データを生成します。

安全に使用できる唯一のケースallは、リスト内のアイテムの数が許容できるほど少ないことが絶対に確実な場合です。これは、ユーザー提供のデータの場合はほとんどありません。ユーザーリストに 1,000 個のアイテムを持つことができる場合、そのうちの 1 つがおそらくそうなるでしょう。

于 2012-12-26T05:17:02.013 に答える