按选择的日期过滤模型以在视图中求和(作为参数传递)

时间:2017-01-13 01:58:05

标签: ruby-on-rails

好吧,我已经坚持这个问题6天了。好消息:在尝试自我解决时,我已经了解了MVC结构的不可估量的数量。坏消息:仍然没有解决它。

提示帮助

在我的应用程序中,我有3个数据源(如果计算会话,技术上为4)。具有许多预算且具有许多交易的用户。

控制器

我目前正在总结用户控制器中3的组合:

#users_controller.rb
def my_budget
  @transaction = current_user.transactions
  @month = params[:search]
  @budget = current_user.budgets
  @user = current_user 
end

视图

在我看来,我根据类型显示每个用户的预算(第1列>与其交易总和(第2列)的比较(对于此示例, 11与我的数据库中的“总收入”相关。然后,我计算两者之间的差异(第3列)。

#my_budget.html.erb
<% @user.budgets.each do |budget| %>
  <tr>
    <td><h3 class="section-header">Current Income:</h3></td>
  </tr>
  <tr>
    <td class="section-sub-header">Gross:</td>
    <td class="section-value"><%= number_to_currency(budget.income_per_month) %></td>

    <td class="section-value"><%= number_to_currency(@user.get_transaction(current_user, 11)) %></td>

    <td class="section-value difference-value"><%= number_to_currency(@user.total_difference(budget.income_per_month, current_user, 11)) %></td>
  </tr>

显然,这些信息毫无用处。例如,如果用户在4月份之前跟踪他们的交易,他们将永远有负预算,因为第2列第3列目前将每月预算与所有交易进行比较自用户创建帐户以来发生的。因此,我尝试了许多尝试来创建选择月份来查看的能力,然后按该值汇总数据。

部分搜索

在我的一个部分中,位于视图的顶部我(特别格式化为用户只能选择MM / YYYY格式的月份和日期):

#_classic_view.html.erb
<%= form_tag(my_budget_path, :method => "get") do %>
  <%= text_field_tag :search, params[:search], name: "startDate", id: "startDate", class: "date-picker form-control", placeholder: "Select Month" %>
  <%= submit_tag "Sort", :name => nil, class: "btn-submit-user text-center", style: "padding: 5px" %>
<% end %> 

模型

以下是我的模型的摘录:

#user.rb
class User < ApplicationRecord
    attr_accessor :search
    has_many :budgets
    has_many :transactions

...

# attempt at pulling the param via search
  def self.search(search)
    where("created_at LIKE ?", "%#{@search}%") 
  end

...

# Get transaction sum for the specific sub-category
  def get_transaction(user, type)
    if search
      total_value = user.transactions.where("transactions.sub_category" => "#{type}").search(@search).sum(:amount)
    else
      total_value = user.transactions.where("transactions.sub_category" => "#{type}").sum(:amount)
    end
  end

我在console.log Ruby Style

的尝试

我已经完成了访问params的计划,只是为了看看我在视图中使用的是什么(哦,我希望Ruby有一个简单的console.log):

#my_budget.html.erb
<h2 class="text-center"><%= @user.current_month(@month) %> Summary</h2>

#user.rb
def current_month(val)
  if val
    current = val
  else
    current = Date.today.strftime("%B %Y")
  end
    current
end

请帮助:

  1. 已解决我在User.rb中使用get_transaction()是否正确?具体来说,我如何调用Transaction。作为整个班级。

  2. 我知道你不应该根据MVC结构访问params,但是如何将这些信息传递给我的模型或视图(因为我传统上没有循环遍历@transaction变量)?

  3. 我的搜索/排序方法是否适用于我在模型,视图和控制器中的实现?

  4. 谢谢!

    编辑:

    解决#1 :我没有正确使用交易。我这样做是因为您无法访问模型中的“current_user”方法,但您可以将其作为视图中的参数传递。我调整了我的代码以显示此修复程序。

1 个答案:

答案 0 :(得分:0)

在模型中创建范围,如

DownloadManager.Query

这将充当过滤器。明智地从控制器访问它。

如果您想找到DownloadManager.Query query = null; Cursor c = null; DownloadManager downloadManager = null; downloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); query = new DownloadManager.Query(); if(query!=null) { query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL| DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING); } else { return; } c = downloadManager.query(query); if(c.moveToFirst()) { int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch(status) { case DownloadManager.STATUS_PAUSED: break; case DownloadManager.STATUS_PENDING: break; case DownloadManager.STATUS_RUNNING: break; case DownloadManager.STATUS_SUCCESSFUL: break; } } 的总和,那么您可以这样做

  class Transaction < ApplicationRecord

    scope :by_month, -> (year, month_name = '') {
      month              = Date::MONTHNAMES.index(month_name.capitalize)
      first_day_of_month = Date.new(year, month, 1)
      last_day_of_month  = Date.new(year, month, -1) # Gives you the last day of month
      where("transactions.created_at between ? and ?", first_day_of_month, last_day_of_month)
    }

  end

用于该月用户的交易金额

:amount