【问题标题】:How to use scope of a model, in a different model's controller in rails 4如何在rails 4中的不同模型的控制器中使用模型的范围
【发布时间】:2014-08-24 07:34:26
【问题描述】:

我有 2 个模型。细分和活动模型。

Campaign has_many segmentation 和 Segmentation belongs_to Campaign。

我从用户那里获取输入并根据给定的过滤器输入创建一个特定的用户列表,并将这些输入保存在我的数据库中。

这就是我保存在我的数据库中的内容

  t.string   :segmentation_name
  t.integer  :date_range
  t.string   :first_event ,              null: false
  t.integer  :first_event_count
  t.string   :second_event
  t.integer  :second_event_count
  t.boolean  :did_the_event
  t.integer  :user_count

在获得所有这些输入之后

我做了所有这些 where 查询来汇集细分

time=Time.now - params[:segmentation][:date_range].to_i.days #date range basi
         currentTime=Time.now 
 if params[:segmentation][:first_event_count].blank? 

 @segmentedUsers=Event.where(params[:segmentation][:first_event] + " > 0").pluck(:user_id)
@segmentedUsers=Event.where(created_at: time .. currentTime)
  params[:segmentation][:user_count]=@segmentedUsers.count

else 

 @segmentedUsers=Event.where(params[:segmentation][:first_event] + " >" + params[:segmentation][:first_event_count] ).pluck(:user_id)  

 params[:segmentation][:user_count]=@segmentedUsers.count

end

但是在那之后我想在我的活动视图和控制器中使用这些细分,但是在创建一个细分之后,即使我通过他们的 user_id 获得了我想要的用户,我在我的活动控制器中并不认识他们。

所以当我在文档和 api 中寻找方法时,我找到了作用域。

所以基本上我认为我可以在我的活动控制器中从我的数据库中获取所有这些输入并在我的活动控制器中进行过滤。

但我不知道该怎么做,因为如果我理解正确,您必须在关联模型中定义范围,在这种情况下它是我的分段模型,那么我将如何继续在我的其他控制器中使用它?

先谢谢了,干杯

【问题讨论】:

  • 你可能想让你的问题更简洁:)

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2 scope


【解决方案1】:

因为你是新手,让我给你一些想法。它不会是一个具体的答案,但希望能帮到你


模型

当您在 Rails 中使用 Models 时,您需要确保您了解它们的工作原理强大

Rails 是一个MVC (Model - View - Controller) 框架:

这意味着每次你调用数据(通过你的控制器),你的Model 将构建一个“对象”,Rails 然后可以使用它在view 等中输出。

您遇到的直接问题是您没有使用模型来构造对象 - 您只是在使用它来拉回不同的数据。这很糟糕。

--

Object Orientated

由于 Ruby 是面向对象的,这意味着您必须确保每次调用数据/运行控制器动作时,实际上都是基于 对象 p>

“对象”与“变量”相似,但同时又不同。主要区别在于 object 包含比变量更多的数据(以 JSON 表示法),允许 Rails 等框架以多种方式处理对象

这很重要的原因是当您在控制器中调用以下代码时:

time=Time.now - params[:segmentation][:date_range].to_i.days #date range basi
         currentTime=Time.now 
 if params[:segmentation][:first_event_count].blank? 

 @segmentedUsers=Event.where(params[:segmentation][:first_event] + " > 0").pluck(:user_id)
@segmentedUsers=Event.where(created_at: time .. currentTime)
  params[:segmentation][:user_count]=@segmentedUsers.count

else 

 @segmentedUsers=Event.where(params[:segmentation][:first_event] + " >" + params[:segmentation][:first_event_count] ).pluck(:user_id)  

 params[:segmentation][:user_count]=@segmentedUsers.count

end

实际上在做的是尝试构建一系列对象。问题是你的电话很糟糕。真的很糟糕。

您最好执行以下操作:

#app/models/event.rb
Class Event < ActiveRecord::Base
   scope :first_event, ->(event) { where(" #{event} > 0").pluck(:user_id) }
end

#app/controllers/events_controller.rb
Class EventsController < ApplicationController
   def your_action
       first_event = params[:segmentation][:first_event]
       @users = Event.first_event first_event
   end
end

这将调用您需要的可靠数据,同时提供更简洁的方式来管理调用。是的,我知道我跳过了很多你的逻辑——太可怕了

--

控制器

最后,你想做一件非常重要的事情

您要确保您拥有正确的控制器设置。许多人遇到的问题是,他们通常会尝试使控制器适应他们的流程——这里的问题是,即使发生这种情况,您也不会以最健壮的方式创建应用程序。

由于 Rails 是面向对象的,因此您的控制器需要与您的对象创建和配置相匹配。一个好的经验法则是只为您希望显示的特定对象创建控制器(在您的情况下为segmented_users

【讨论】:

  • 老兄,你真的是我的救星。每次你回答我的一个问题时,我都会学到很多东西。再次感谢您,漂亮的答案。您成为 Rails 大师已有多少年了?我大约 2 周前开始工作,您能给我一些好的事后诸葛亮 :)
  • 哈哈谢谢。我已经使用 Rails 大约 3 年了;严重约1.5。我的回答真的不能解决你的问题——你需要更具体地说明你在问什么,但如果它可以提供信息,那肯定是双赢的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多