Rails rails 的 lib 数据库查询问题

dxwts · 2014年03月20日 · 最后由 dxwts 回复于 2014年03月20日 · 2616 次阅读

请问我在 lib 里查询数据库却什么都没查到是什么问题,我在同步一个 sql server 的数据库,本地是 mongo,下面的代码在查到本地已插过的数据进行更新操作,可是查出来的@data我不知到是什么东西,打印@data.class什么也没有打出来,插入是没有问题的,能跳到 update 分支,不过 undefined method `update' for nil:NilClass data 好像是 nil

def sync(table)

    # "Materiale::#{table}".constantize.destroy_all
    result = @client.execute("select #{@TABLES[table]['attributes']} from #{table.upcase}");

    p_key = {}

    result.each do |row|
      @TABLES[table]['key'].each do |key|
        p_key[key] = row[key]
      end

      @data = "Materiale::#{table}".constantize.where(p_key).first

      if @data.blank?
        insert(table, row)
      else
        update(@data, row)
      end
    end
  end

def insert(table, row)

    @data = "Materiale::#{table}".constantize.new(row)

    @TABLES[table]['depend'].each do |depend|
      if !@data["#{depend['key']}"].nil?
        @depend = "Materiale::#{depend['table']}".constantize.where(depend['key'] => @data["#{depend['key']}"]).first
        @data["#{depend['table'].downcase}_id"] = @depend.id
      end
    end

    @data.save
  end

  def update(data, row)
    puts "update  data"
    data.update(row)
  end

请注意观察这里

def update(data, row)
    puts "update  data"
    data.update(row)
  end

data.update 是哪里的

#1 楼 @floger 在 sync() 里传进去,是不是不能这样写?

@data = "Materiale::#{table}".constantize.where(p_key).first

  if @data.blank?
    insert(table, row)
  else
    update(@date, row)
  end

@dxwts

def update(data, row)
    puts "update  data"
    @data = data
    @data.update(row)
  end

没有看见你在任何地方定义这个 data 的对象,

#3 楼 @floger 一样的,我在代码里打印是下面的结果,不知道为什么

@data = "Materiale::#{table}".constantize.where(p_key).first
      puts @data.nil?  --------------------> false


def update(data, row)
    puts "update  data"
      puts data.nil?  --------------------> true
    @data = data
    @data.update(row)
  end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号