0

私のアプリでは、puts self.ideas.inspect出力:

[#<Idea id: 1, title: "Ad et ut nesciunt ut.", 
note: ["Ratione et aut harum.", "Dicta nostrum sit officiis voluptates molestiae veritatis ut."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>, 
#<Idea id: 2, title: "Asperiores dolores modi et.", 
note: ["Reprehenderit harum consequuntur repellendus qui.", "Labore eum minus voluptas quidem aliquid est occaecati."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>, 
#<Idea id: 3, title: "Labore nam deserunt quibusdam.", 
note: ["Sequi saepe itaque.", "Numquam distinctio vel hic et qui."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>]

それでも次の行では、 claimed_count = self.ideas.where(status: "claimed").size0を返します。私のクエリ構文は明らかに間違っていますが、私はこのガイドを熟考していて、それでも理解できません!

非常に基本的なものでなければなりません...誰か?

編集:次のテストを使用して、このアイデアのコレクションを取得しました。

it "can't claim an idea if he already has 3 ideas with claimed status" do
  james.claim(si_title0)
  james.claim(si_title1)
  james.claim(si_title2)
  james.claim(si_title3)
  james.ideas.size.should eq 3
end

醜いテストでごめんなさい...合格した後、リファクタリングのための補間を理解しようとしていました。上記のinspectダンプは、ループの3回目または4回目の反復からのものです。

編集2:これは何をするかclaimです:

  def claim(idea)
    puts self.ideas.inspect
    #claimed_count = self.ideas.where(status: "claimed").count
    claimed_count = self.ideas.count(conditions: "status='claimed'")
    puts "claimed_count is #{claimed_count.inspect}"
    if idea.status == "available" && claimed_count < 3
      self.ideas<<idea
      idea.status = "claimed"
    end
  end

それで...それはデータベースに保存されませんか?もしそうなら、私はそれをどのように修正する必要がありますか?

4

2 に答える 2

3

claim()「主張された」ideaステータスをデータベースに保存していないと思われます。ideasこの動作を変更する必要があります(それが本当に必要な場合) where。これに使用できますselect

james.ideas.select{|idea| idea.status == "claimed"}.size

また、ヘルパー メソッドを追加しIdeaて、クエリを簡単にすることができます。

class Idea < ActiveRecord::Base
  def claimed?
    status == "claimed"
  end
end

james.ideas.select(&:claimed?).size

アップデート

属性ideaを変更した後、オブジェクトを保存するために何も呼び出されないため、コードはステータスをそのまま保存しません。statusこれは、呼び出しの順序を逆にすることで修正できます。

if idea.status == "available" && claimed_count < 3
  idea.status = "claimed"
  self.ideas<<idea
end

'shovel' オペレーターは<<、永続化されたオブジェクトの関連付けコレクションにアイデアを追加しているため、アイデアを保存します。

于 2012-12-27T19:21:05.613 に答える
0

データは各テストの最後に破棄されます。テストが終了すると、挿入されたデータはロールバックされます。テスト間で永続化するべきではありません!

をどのように、どこで使用してwhereいますか? また、モデル (具体的にはideas関連付け) はどのように見えますか?

于 2012-12-27T19:19:07.570 に答える