Использование связей "один ко многим" для гема 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
уже заполнены.