2011-07-12 13 views
0

お手数をお手伝いいただきありがとうございます。私は2つのモデルで次の関係を持っています:Rails 3:has_oneとhas_manyを同時に更新して同じテーブルを指す方法

class Reader < ActiveRecord::Base 
    has_many :books, :dependent => :destroy 
    has_one :last_book, :class_name => "Book" 
end 

class Book < ActiveRecord::Base 
    belongs_to :reader 
end 

私はlast_bookを読者に関連付けられた最新の本にします。私はこれがデータベースに二度本を書いて終わると思う更新

def create 
    @reader = Reader.find(params[:reader_id]) 
    @book = @reader.books.new (params[:book]) 
    @reader.last_data = @book 
end 

に同様のコードを次のように

は、今のところ私の本コントローラに私が本を作成しています。これを行うクリーナー/効率的な方法がありますか?

答えて

1

has_oneは、:order句を許可します。

class Reader < ActiveRecord::Base 
    has_many :books, :dependent => :destroy 
    has_one :last_book, :class_name => "Book", :order => "books.created_at desc" 
end 

その後、あなたのコントローラのアクションで、あなたの割り当ての1

def create 
    @reader = Reader.find(params[:reader_id]) 
    @book = @reader.books.new (params[:book]) 
end 
を落とすだろう

ジェフ・スミスの解答も正解です。

3

私は、あなたの団体が本当にあなたが彼らを志望しているように働くとは思わないのです。特定のリーダーに関連付けられたすべての書籍に同じreader_idが割り当てられるため、Readerモデルでは、どの書籍がlast_bookであるかを特定することはできません。 reader.last_book = bookの書籍を読者に割り当てることは、実際にはその書籍モデルのreader_id列を読者のIDに設定することです。これは、reader.booksに本を追加したときと同じことです。したがって、last_bookに電話すると、どの本を意味するのかは分かりません。

モデル化しようとしているlast_bookの関連付けのためのメソッドを定義する方がよいでしょう。あなたが正しくしようとしていることを理解していれば、last_bookは読者のために最近作成された本でなければなりません。お使いのリーダーのモデルでは、このような何か:

def last_book 
    books.order('created_at desc').first 
end 

を、あなたはreader.last_bookような何かをできるようにする必要があり、このライン

has_one :last_book, :class_name => "Book" 

を削除し、それが本協会の中で最も最近作成したブックをつかむだろう。この方法では、last_bookを明示的に割り当てる必要はありません。その書籍をreader.booksに追加するだけです。最後の書籍が必要な場合はreader.last_bookに電話してください。あなたがこれを行うことができますので、

関連する問題