Ruby on Rails使用三个字段过滤数组

时间:2013-12-20 17:54:06

标签: ruby-on-rails ruby-on-rails-3

我正在尝试使用3列搜索我的模型。此外,如果列为空,则该列有效。这就是我这样做的方式

def getactivityfortoday
@temp = params[:temp]
logger.debug "params temp:#{@temp.inspect}"
@sky = params[:sky]
@day = params[:day]
@todaysactivities = []
@activities=[]
@finaldata = []
@activities = Weatherclockactivity.all
@attemptactivities = []
@attemptactivities = @user.attempts
for activity in @activities do
  logger.debug "activity: #{activity.attributes.inspect}"
  if @temp.to_i < activity.temperatureMax.to_i && @temp.to_i > activity.temperatuureMin.to_i
    if @sky == activity.sky || activity.sky == ""
      if @day == activity.day 
        @todaysactivities << activity
      end
    end
  end
end
for activity in @todaysactivities
  for attempt in @attemptactivities
    if attempt == activity
      finaldata << {activity: activity, attempt: "yes"}
    else
      finaldata << {activity: activity, attempt: "no"}
    end
  end
end

respond_to do |format|  
    format.html { render action: "new" }
    format.json { render json: @finaldata }
end

我得到的响应是一个空数组,但我应该得到3行作为响应。

3 个答案:

答案 0 :(得分:1)

拼写错误

activity.temperatuureMin.to_i  

并且

finaldata << {activity: activity, attempt: "yes"}

应该是

@finaldata << {activity: activity, attempt: "yes"}

你也可以更简洁

def getactivityfortoday
  @temp = params[:temp]
  logger.debug "params temp:#{@temp.inspect}"
  @sky = params[:sky]
  @day = params[:day]
  @activities = Weatherclockactivity.all
  @attemptactivities = @user.attempts
  @finaldata = @activities.map do |activity|
    if (activity.temperatureMin.to_i + 1...activity.temperatureMax.to_i).include?(@temp.to_i)  && ( @sky == activity.sky || activity.sky == "") && @day
       @attemptactivities.include?(activity) ? {activity: activity, attempt: "yes"} : {activity: activity, attempt: "no"}  
    end 
  end.compact
  respond_to do |format|  
    format.html { render action: "new" }
    format.json { render json: @finaldata }
  end
end

答案 1 :(得分:0)

这样的事情怎么样?

我试图在可读性和简洁性之间取得平衡。首先,我们过滤所需的活动。然后我们构造输出。这应该更容易调试。

def getactivityfortoday
  @temp = params[:temp].to_i
  @sky = params[:sky]
  @day = params[:day]

  @activities = Weatherclockactivity.all

  @attemptactivities = @user.attempts

  selected_activities = @activities.select do |activity|
    # Make sure it's the right temperaure
    return false unless (activity.temperatureMin.to_i + 1 ... activity.temperatureMax.to_i).include? @temp

    # Make sure the sky matches, or the sky is blank
    return false unless (@sky.blank? || @sky.activity == activity.sky)

    # Make sure the day matches
    return false unless @day == activity.day

    # Otherwise, it's good!
    return true
  end

  selected_attempted_activities = selected_activities.map do|activity| 
    ret = {activity: activity}
    ret[:attempt] = @attemptactivities.include?(activity) ? "yes" : "no"
    ret
  end

  respond_to do |format|  
    format.html { render action: "new" }
    format.json { render json: selected_attempted_activities }
  end
end

原作中有一些拼写错误(例如,@finaldata不是最终数据)。确保正确拼写实例变量(以@开头的内容,如@sky),因为如果您尝试访问未定义的实例变量,它将默认默认为nil。

答案 2 :(得分:0)

最好和最灵活的方法是使用ActiveModel::Model 它允许您使用更多有用的方法。 它似乎是: 应用程序/模型/ activity_report.rb

Class ActivityReport
  include ActiveModel::Model

  attr_accessor :day, :activity # and etc.

  validates :day, presence: true

  def day
    @day.to_s # for example
  end

  def day=(value)
    @day = value - 1.month # for example every date which user set will set on one month ago
  end

  # and etc
end

应用程序/控制器/ posts_controller.rb

...
def index
  @activity = ActivityReport.new(params[:activity])
end

def create
  @activity.create!
end
...

应用程序/视图/帖/ index.html.haml

= form_for @activity do |f|
  = f.day

有关详细信息,请查看: http://edgeapi.rubyonrails.org/classes/ActiveModel/Model.html
http://railscasts.com/episodes/219-active-model(旧)
http://railscasts.com/episodes/416-form-objects(更新,但有点复杂)