Ruby on Rails 将属性从活动记录添加到现有对象

mdi*_*147 2 ruby object ruby-on-rails-4

我的问题一开始似乎很简单,但我还无法解决它,所以我从数据库中获取一些记录,然后我需要为每个检索到的记录添加一个属性。我尝试按照我的模型

class Lesson < ActiveRecord::Base
    attr_reader   :palindrome #getter
    attr_writer   :palindrome #setter
    attr_accessor :palindrome #both

    belongs_to  :schedule
    belongs_to  :user
    has_one     :schedule


end
Run Code Online (Sandbox Code Playgroud)

在我的控制器中我这样做是为了添加它

def index
    @lessons = Lesson.select(:id,:start_date,:users_allowed,:name,:users_enrolled).where(start_date: (Time.now.beginning_of_week.beginning_of_day)..Time.now.end_of_week.end_of_day).order(start_date: :desc)
    @schedules  = Array(Schedule.where(user_id: 50).pluck(:lesson_id))

    day_id    = params[:id].to_i
    @day_1 = []
    @day_2 = []
    @day_3 = []
    @day_4 = []
    @day_5 = []
    @day_6 = []
    if day_id.present?
      @lessons.each do |lesson|
        lesson.palindrome =  'TEST'
         case lesson.start_date.wday
          when 1
            @day_1 << lesson
           when 2
            @day_2 << lesson
           when 3
            @day_3 << lesson
           when 4
            @day_4 << lesson
           when 5
            @day_5 << lesson
           when 6 
            @day_6 << lesson
         end
      end
      case day_id
        when 1
        @lessons = @day_1
        when 2
        @lessons = @day_2
        when 3
        @lessons = @day_3
        when 4
        @lessons = @day_4
        when 5
        @lessons = @day_5
        when 6
        @lessons = @day_6
      end
      render json: @lessons
    end
  end
Run Code Online (Sandbox Code Playgroud)

但我得到了这个回应

[
  {
    "id": 7019,
    "start_date": "2016-10-24T20:30:00.000Z",
    "users_allowed": 4,
    "name": "Power - Funcional",
    "users_enrolled": 2
  },
  {
    "id": 7018,
    "start_date": "2016-10-24T20:00:00.000Z",
    "users_allowed": 4,
    "name": "Power - Funcional",
    "users_enrolled": 0
  }]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,没有返回我分配的新属性,但是我尝试通过调用

render json: @lessons[0].palindrome
Run Code Online (Sandbox Code Playgroud)

它确实返回了属性的值,我的问题是,当我渲染整个对象时,它返回新的 attr 值,我该怎么做?非常感谢

Pyr*_*rce 9

您传递的是 ActiveRecord 对象数组,而不是哈希值。json 转换器将解析模型的属性,而不是分配给这些对象的自定义变量。尝试将模型转换为哈希:

lesson = lesson.attributes
lesson['palindrome'] = 'TEST'
Run Code Online (Sandbox Code Playgroud)

还要考虑重构你的代码,我认为你不需要那些 case 语句,也不需要那些@dayx难以理解的变量。