【问题标题】:How to use parameters value from public_activity gem (Rails)?如何使用来自 public_activity gem(Rails)的参数值?
【发布时间】:2015-07-25 00:10:33
【问题描述】:

我正在构建一个 Rails 应用程序。在我的应用程序中,有用户可以“关注”的项目。当用户关注其中一个页面时,如果有人上传/创建文件夹/文件,他/她将获得更新。

以下是有人刚刚创建新文件夹时的截图:

下面是我的文件夹控制器中“创建”操作的代码:

 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的参数正在创建中。

下面是这个参数值保存后在数据库中的截图:

问题:

所以我的问题是,如何在我的活动控制器中使用此参数值?

这是我现在的活动控制器的代码:

class ActivitiesController < ApplicationController
  def index
    @activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.following_users, owner_type: "User")
  end
end

我想使用 parameters 列中的 "project_id" 值,而不是使用 "owner_id:"。那我该怎么做呢?

非常感谢您提前! :)

【问题讨论】:

  • 不是一个准确或干净的答案,但我认为在你的情况下你可以这样做 where(trackable_id: Folder.where(project_id: current_user.followed_projects), trackable_type: 'Folder' ) 。我认为否则您将必须获取可跟踪类型“文件夹”的所有记录,然后在 ruby​​ 中检查它们。

标签: ruby-on-rails gem public-activity


【解决方案1】:

参数字段包含一个简单的 yaml 转储,因此不太容易高效搜索。

一个简单的解决方案是使用LIKE 运算符,例如

PublicActivity::Activity.where("parameters LIKE '%project_id: #{@project.id}%'")

您可能需要考虑添加 custom fields

【讨论】:

  • 您好,感谢您的回答!但我想使用 LIKE 运算符会使查询变慢,对吧?无论如何,我已经添加了自己的答案:)
【解决方案2】:

感谢您的回答,但我得到了比使用参数值或自定义字段更好的解决方案。 这是我的活动控制器现在的样子:

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

通过使用这种方式,我可以轻松地结合来自“用户”和用户关注的“项目”的活动。

您可以修改它以添加任何其他活动,例如来自“评论”或“投票”。

希望这将帮助其他正在使用 public_activity gem 的人! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多