如何使用 public_activity gem (Rails) 中的参数值?
How to use parameters value from public_activity gem (Rails)?
我正在构建一个 Rails 应用程序。在我的应用程序中,有用户可以 "Follow" 的项目。当用户关注其中一个页面时,如果有人 uploads/creates 和 folder/file.
,he/she 将获得更新
下面是刚刚新建文件夹时的截图:
下面是我的文件夹控制器中 "Create" 操作的代码:
def create
@folder = current_user.folders.where(project_id: params[:project_id]).create(folder_params)
respond_to do |format|
if @folder.save
@folder.create_activity :create, owner: current_user, :params => {
:project_id => proc {|controller, project| @folder.project.id},
:project_name => proc {|controller, project| @folder.project.name},
}
format.html { redirect_to @folder.project, notice: 'Folder was successfully created.' }
format.json { render :show, status: :ok, location: @folder }
else
format.html { render :new }
format.json { render json: @folder.errors, status: :unprocessable_entity }
end
end
结束
如你所见:project_id和:project_name是新建文件夹时public_activity的参数。
下面是这个参数值保存后在数据库中的截图:
问题:
所以我的问题是,如何在 activities_controller 中使用这些参数值?
这是我现在的活动控制器的代码:
class ActivitiesController < ApplicationController
def index
@activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.following_users, owner_type: "User")
end
end
而不是使用 "owner_id:",我想使用 "project_id" 中的值 参数列。那我该怎么做呢?
非常感谢您提前! :)
参数字段包含一个简单的 yaml 转储,因此不太容易有效地搜索。
一个简单的解决方案是使用 LIKE
运算符,例如
PublicActivity::Activity.where("parameters LIKE '%project_id: #{@project.id}%'")
您可能要考虑添加 custom fields。
感谢您的回答,但我得到了比使用参数值或自定义字段更好的解决方案。
这是我的 activities_controller 现在的样子:
class ActivitiesController < ApplicationController
def index
activity_table = PublicActivity::Activity.arel_table
# We want to view all activity of folders related to projects we are follwing
folder_ids = Folder.where(project_id: current_user.following_projects.pluck(:id)).pluck(:id)
# Generate query for all activity related to folders we care about
folders_query = activity_table[:trackable_type].eq('Folder').and(
activity_table[:trackable_id].in(folder_ids)
)
# Generate query for all users that we follow
users_query = activity_table[:owner_id].in(current_user.following_users.pluck(:id))
activity_query = folders_query.or(users_query)
@activities = PublicActivity::Activity.where(activity_query)
end
end
通过这种方式,我可以轻松地将用户关注的 "Users" 和 "Projects" 中的活动结合起来。
您可以修改它以添加任何其他活动,例如来自 "Comments" 或 "Voting"。
希望这会帮助其他正在使用 public_activity gem 的人! :)
我正在构建一个 Rails 应用程序。在我的应用程序中,有用户可以 "Follow" 的项目。当用户关注其中一个页面时,如果有人 uploads/creates 和 folder/file.
,he/she 将获得更新下面是刚刚新建文件夹时的截图:
下面是我的文件夹控制器中 "Create" 操作的代码:
def create
@folder = current_user.folders.where(project_id: params[:project_id]).create(folder_params)
respond_to do |format|
if @folder.save
@folder.create_activity :create, owner: current_user, :params => {
:project_id => proc {|controller, project| @folder.project.id},
:project_name => proc {|controller, project| @folder.project.name},
}
format.html { redirect_to @folder.project, notice: 'Folder was successfully created.' }
format.json { render :show, status: :ok, location: @folder }
else
format.html { render :new }
format.json { render json: @folder.errors, status: :unprocessable_entity }
end
end
结束
如你所见:project_id和:project_name是新建文件夹时public_activity的参数。
下面是这个参数值保存后在数据库中的截图:
问题:
所以我的问题是,如何在 activities_controller 中使用这些参数值?
这是我现在的活动控制器的代码:
class ActivitiesController < ApplicationController
def index
@activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.following_users, owner_type: "User")
end
end
而不是使用 "owner_id:",我想使用 "project_id" 中的值 参数列。那我该怎么做呢?
非常感谢您提前! :)
参数字段包含一个简单的 yaml 转储,因此不太容易有效地搜索。
一个简单的解决方案是使用 LIKE
运算符,例如
PublicActivity::Activity.where("parameters LIKE '%project_id: #{@project.id}%'")
您可能要考虑添加 custom fields。
感谢您的回答,但我得到了比使用参数值或自定义字段更好的解决方案。 这是我的 activities_controller 现在的样子:
class ActivitiesController < ApplicationController
def index
activity_table = PublicActivity::Activity.arel_table
# We want to view all activity of folders related to projects we are follwing
folder_ids = Folder.where(project_id: current_user.following_projects.pluck(:id)).pluck(:id)
# Generate query for all activity related to folders we care about
folders_query = activity_table[:trackable_type].eq('Folder').and(
activity_table[:trackable_id].in(folder_ids)
)
# Generate query for all users that we follow
users_query = activity_table[:owner_id].in(current_user.following_users.pluck(:id))
activity_query = folders_query.or(users_query)
@activities = PublicActivity::Activity.where(activity_query)
end
end
通过这种方式,我可以轻松地将用户关注的 "Users" 和 "Projects" 中的活动结合起来。
您可以修改它以添加任何其他活动,例如来自 "Comments" 或 "Voting"。
希望这会帮助其他正在使用 public_activity gem 的人! :)