0

我有一個作者擁有並且屬於多本書的場景,反之亦然。在instructions之後建立one-to-many關係中的關聯可以正常工作,但是當介紹many-to-many關係時,只要嘗試創建或更新我的書籍模型,就會收到此錯誤消息。與Rails中的公共活動使用多對多關係

undefined method `author' for #<Book:0x007fb91ae56a70> 

至於設立的作者是如何選擇一本書我使用令牌輸入提供的代碼railscast here有一些改變。

class Author < ActiveRecord::Base 
    has_many :authorships 
    has_many :books, through: :authorships 

    def self.tokens(query) 
     authors = where("name like ?", "%#{query}%") 
     if authors.empty? 
      [{id: "<<<#{query}>>>", name: "Add New Author: \"#{query}\""}] 
     else 
      authors 
     end 
    end 

    def self.ids_from_tokens(tokens) 
     tokens.gsub!(/<<<(.+?)>>>/) {create!(name: $1).id} 
     tokens.split(',') 
    end 
end 

class Book < ActiveRecord::Base 
    attr_reader :author_tokens 

    include PublicActivity::Model 
    tracked owner: :author 

    has_many :authorships 
    has_many :authors, through: :authorships 

    def author_tokens=(ids) 
     self.author_ids = Author.ids_from_tokens(ids) 
    end 
end 

表單視圖

<%= form_for(@book) do |f| %> 
    ... 

    <div class="field"> 
    <%= f.text_field :author_tokens, label: 'Author', input_html: {"data-pre" => @book.authors.to_json} %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

@MohammadAbuShady任何想法如何根據之前討論的一對多來完成? – 2015-04-02 17:42:54

+0

當你把它改成'has_many:authors'你失去了'author'方法並且得到了'authors'方法 – 2015-04-02 20:07:34

+0

@MohammadAbuShady完美無缺。 Piotrek提供的解決方案展示瞭如何在proc中選擇一個作者,但目標是讓他們全部完成。這可能在這種特殊情況下做到嗎? – 2015-04-02 21:17:44

回答

-1
class Author < ActiveRecord::Base 
    has_many :author_books, inverse_of: :author, dependent: :destroy 
    accepts_nested_attributes_for :author_books 
    has_many :books, through: :author_books 
end 

class Book < ActiveRecord::Base 
    has_many :author_books, inverse_of: :book, dependent: :destroy 
    accepts_nested_attributes_for :author_books 
    has_many :authors, through: :author_books 
end 

class AuthorBook < ActiveRecord::Base 
    validates_presence_of :book, :author 
end 

=============視圖==============

<%= form_for @book do |f| %> 
    <%= f.text_field :title %> 
    <%= f.fields_for :author_books do |f2| %> 
    <%# will look through all author_books in the form builder.. %> 
    <%= f2.fields_for :author do |f3| %> 
     <%= f3.text_field :name %> 
    <% end %> 
    <% end %> 
<% end %> 
+0

您的答案缺少設置公共活動所需的代碼 – 2015-04-02 19:32:50

0

您的Book模型中沒有author關係。

什麼

tracked owner: :author 

確實基本上是調用您的圖書實例方法author。您應該嘗試:authors

但是!

這不會解決您的問題,因爲owner只能是一個。所以你可以這樣做:

tracked owner: proc {|_, book| book.authors.first } 

將所有者設置爲書的第一作者。

+0

測試它完全按照它讀取,但它當兩本或更多作者被添加到書中時,問題就會出現。在活動視圖中,它只會記錄該書的第一作者有活動。 – 2015-04-02 21:15:35

+0

如果您想爲每位作者創建一個活動,您需要通過Book實例上的'create_activity'調用manualy。 – 2015-04-08 07:58:59

+0

這個邏輯怎麼看?它是通過書籍控制器完成還是通過模型中的某種回調完成? – 2015-04-08 13:49:16