2011-01-15 6 views
3

長いタイトルのためにお詫びしますが、これは私を悩ましています。私はRailsが初めてのので、これが私の最初のプロジェクトです。 Rails 3.0.3。Do Rails 3 Active Record動的find_or_create finderメソッドにはいくつかの不整合がありますか?

私のモデルでは、Userは、多くの場合、Entriesと読み込まれている場合があります。これはReadEntriesというモデルで追跡されます。この多対1の関係は、コード内で適切に定義されていると私は考える。

User.rb:

has_many :read_entries 

Entry.rb:

has_many :read_entries 

ReadEntry.rb:

belongs_to :entry 
belongs_to :user 

この表は、ある時点で移入されなければなりません。私がこれをやろうとすると:

user.read_entries.find_or_create_by_entry_id(entry.id, :read => false) 

私はエラーUnknown key(s): readを受け取ります。 :readを設定しようとすると、動作します。

私はこれと同じ行を作成する場合は、それが動作:

ReadEntry.find_or_create_by_entry_id_and_user_id(entry.id, user.id, :read => false) 

を論理的には、これらの方法は右、同一である必要がありますか?ありがとう。

+0

リレーションシップでfind_or_createを使用すると、全体的に奇妙な動作が見られます。もし誰かがこれを理解したら、間違いなく興味があるでしょう。今のところupvoted。 –

+0

また、最初のケースではfind_or_initialize_by_entry_idを実行してから、次のように設定することができます。保存する前に返されたオブジェクトを読み込みます。 – drinian

答えて

1

私はfind_or_createで奇妙な経験もしています。それがうまくいくなら私はそれを愛するだろうが、それは矛盾しているようだ。

私は現在、あなたと同じ問題を抱えています。モデルとは対照的に、find_or_createを関連付けて呼び出すことが原因である可能性があります。ここに私の例です:

permission_assignments.find_or_create_by_role_id(:role_id => role_id, :is_allowed => false) 

これは、割り当てを作成するために働き、「is_allowed」フィールドは、それに設定されますを除いて、「真」のデフォルトです。このコードは、(許可モデルでは、それゆえ自己参照)私の作品

PermissionAssignment.find_or_create_by_permission_id_and_role_id(:permission_id => self.id, :role_id => role_id, :is_allowed => false) 

それは、残念ながら、より冗長なのですが、それは動作します。私がまだ気づいている唯一の問題は、返されるオブジェクトにはidが割り当てられていないということです(ただし、レコードはデータベースに作成されますが、idを指定しなくてもそれ以上の属性を更新したくない場合) 。それが別の問題かどうかはわかりません。

Rails 3.0.4 here with Postgres 8.4

1

Railsは検索のオプションであると想定しているため、他のフィールドは渡すことができません。代わりに、メソッドを長く呼び出す必要があります。

user.read_entries.find_or_create_by_entry_id_and_read(entry.id, false) 

代わりに、短いカスタム構文を使用してください。

最後の例として、Railsは2番目の引数をとり、オプションとして使用します。それ以外は、わからない。

+0

APIのドキュメントはそれほど明確ではないことは認めますが、最終的なハッシュ引数を使用して値を設定する必要があることを示す例が含まれています。 – drinian

関連する問題