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 Любая идея о том, как это будет сделано, исходя из обсуждаемого ранее вопроса «один-ко-многим»? –

+0

, когда u изменил его на 'has_many: authors', вы потеряли метод' author' и получили метод 'author' вместо –

+0

@MohammadAbuShady Делает прекрасный смысл. Решение, предоставленное Piotrek, показывает, как выбрать одного автора в proc, но целью было бы получить их все. Можно ли это сделать в этом конкретном сценарии? –

ответ

-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

В вашем ответе отсутствует код, необходимый для настройки общественной активности –

0

Что

tracked owner: :author 

делает в основном вызывается метод author на экземпляр книги. Вы должны попробовать :authors

Но!

Это не решит вашу проблему, потому что owner может быть только одним. Таким образом, вы можете сделать что-то вроде:

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

, чтобы задать владельцу первый автор книги.

+0

Тестирование этого происходит именно так, как оно читается, но проблема возникает, когда к книге добавляются два или более авторов. В представлении о действиях будет записано только то, что первый автор этой книги имел активность. –

+0

Если вы хотите создать мероприятие для каждого автора, вам нужно сделать это вручную с помощью 'create_activity', вызванного экземпляром Book. –

+0

Как будет выглядеть эта логика? Будет ли это сделано с помощью контроллера книг или какого-то обратного вызова в модели? –