Rails 3.1 Странное поведение ActiveRecord в действии Создать - PullRequest
0 голосов
/ 05 ноября 2011

Использование Rails 3.1.0

def create
@practice = Practice.new(params[:practice])

respond_to do |format|
  if (current_user.practices << @practice rescue false)

    pmf = current_user.practices_users.inspect # if this line is removed the following update_attributes method breaks!

    current_user.practices_users.last.update_attributes(:admin_flg => true, :first_name => params[:first_name], :last_name => params[:last_name])
    format.html { redirect_to home_dashboard_path, notice: 'Practice was successfully created.' }
    format.json { render json: @practice, status: :created, location: @practice }
  else
    format.html { render action: "new" }
    format.json { render json: @practice.errors, status: :unprocessable_entity }
  end
end
end

Когда строка 'pmf = ...' отсутствует, я получаю эту строку

NoMethodError:
   undefined method `update_attributes' for nil:NilClass

Когда присутствует строка 'pmf = ...', действие create работает нормально. Что происходит?

1 Ответ

2 голосов
/ 05 ноября 2011

Я не знаю точного ответа, но я могу помочь вам отладить ...

Когда вы делаете

pmf = current_user.practices_users.inspect

, тогда Rails загружает весь набор practices_users (для current_user) из базы данных, и когда вы вызываете last чуть позже, он вызывает метод last для объекта типа Array.

Когда вы делаете

current_user.practices_users.last

, не сделав ваш вызов pmf, весь набор practices_users не был загружен из базы данных в массив, и Rails не собирается загружать весь набор, потому что все, что вам нужно, это последний. Было бы бесполезно загружать массив элементов, когда все, что нужно для загрузки, является последним. Таким образом, он будет генерировать SQL, который загружает только одну строку из базы данных.

В такой ситуации вам нужно просмотреть консоль или журнал разработки, чтобы увидеть, что именно генерирует SQL Rails и почему этот SQL не возвращает никакого значения. Тогда станет ясно, что происходит.

...