Использование связей "один ко многим" для гема Rails Public Activity

Я только начал использовать гем PublicActivity и хотел отобразить действия авторов по всему сайту. В приложении у автора много книг. Когда автор выпускает новую книгу, я бы хотел, чтобы в фидах пользователей появлялось уведомление. Я стараюсь изо всех сил перевести то, что показано в примере кода, вот что я придумала до сих пор:

модели

class Reader < ActiveRecord::Base
end

class Author < ActiveRecord::Base
    has_many :books
end

class Book < ActiveRecord::Base
  include PublicActivity::Model
  tracked owner: :author, recipient: :reader

  belongs_to :author, :class_name => "Author"
  belongs_to :reader, :class_name => "User"
end

Контроллер деятельности

class ActivitiesController < ApplicationController
  def index
    @activities = PublicActivity::Activity.all
  end
end

Индекс активности

<% @activities.each do |activity| %>
    <%= activity.inspect %> # Using inspect for now to debug
<% end %>

На данный момент в консоли я создаю и добавляю книги автору (author являясь переменной экземпляра) так:

author.books << Book.create(name: "Jaws")

Деятельность записывается, но owner_id а также recipient_id равны нулю, когда на самом деле владелец должен быть автором, а получатель должен быть пользователем.

#<PublicActivity::Activity id: 1, trackable_id: 1, trackable_type: "Book", owner_id: nil, owner_type: nil, key: "book.create", parameters: {}, recipient_id: nil, recipient_type: nil, created_at: "2015-04-01 17:36:18", updated_at: "2015-04-01 17:36:18">

1 ответ

Решение

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

author.books.create(name: "Jaws")

Затем, если вы хотите сохранить читателя, вам нужно добавить его в хэш args

author.books.create(name: "Jaws", reader: some_user)

Замечания:
Причина, по которой это предварительно заполняет объект, заключается в том, что при вызове new для объекта отношения активной записи все условия внутри условия используются для создания нового объекта, например

Book.where(author: some_author).new

Это создаст экземпляр книги и author_id будет идентификатором some_author откуда запрос.

Поэтому, когда мы сделали author.books это создало запрос

Book.where(author_id: author.id)

И при вызове новой, новая книга будет иметь идентификатор автора.

PS: это также работает на нескольких аргументах в where

Model.where(key1: value1, key2: value2, key3: value3).new

создаст новый экземпляр, где атрибуты key1, key2, key3 уже заполнены.

Другие вопросы по тегам