Относится к ассоциации пользователей с полиморфной c маршрутизацией - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть небольшое приложение, где у меня есть даунтаун, и у меня есть свойства. У каждого центра города есть много свойств, и у каждого свойства есть один центр города.

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

Мои методы, связанные с контроллером, приведены ниже. Я думал, что строка, добавив @property.user_id = current_user.id, позаботится об этом. Однако, если я тогда запускаю Property.last.user

, я получаю ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.property_id:

# GET /downtowns/1/properties/new
def new
  set_downtown
  @property = @downtown.properties.new
end

# POST /downtowns/1/properties
def create
  set_downtown
  @property = @downtown.properties.new(property_params)
  @property.user_id = current_user.id

  if @property.save
    redirect_to @downtown
  else
    render :new
  end
end

private

def set_downtown
  @downtown = Downtown.includes(:properties).find(params[:downtown_id])
end

В моих моделях

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :properties
  has_many :downtowns
end

class Property < ApplicationRecord
  belongs_to :downtown
  belongs_to :user

  has_one :user  
end

Не знаю, нужно ли мне вставьте это, но мои файлы маршрутов

Rails.application.routes.draw do
  devise_for :users
  root :to => "downtowns#index"
  resources :cities

  resources :downtowns do
    resources :properties
  end
end

Если кто-нибудь сможет взглянуть на это, я действительно буду благодарен! Большое вам спасибо!

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: такого столбца нет: users.property_id

, поскольку у вас есть has_one :user в Property. Это означает, что user удерживает id Property как property_id.

вместо Property удерживает User#id как user_id.

remove has_one :user

class Property < ApplicationRecord
  belongs_to :downtown
  belongs_to :user      # this table has user_id
end
1 голос
/ 25 февраля 2020
class Property < ApplicationRecord
  belongs_to :downtown
  belongs_to :user
end

Вы хотите использовать ассоциацию belongs_to, так как столбец внешнего ключа находится на этой модели. Обратная has_many ассоциация всегда является belongs_to ассоциацией.

Если вы объявляете две ассоциации с тем же именем, что и у вас, более поздняя ассоциация всегда будет перезаписывать первую.

Вы также почти никогда не должны (или не хотите) явно использовать установщик _id=. Вместо этого используйте установщик user=.

before_action :set_downtown, only: [:new, :create, :index] # DRY

# POST /downtowns/1/properties
def create
  @property = @downtown.properties.new(property_params) do |p|
    p.user = current_user
  end
  if @property.save
    redirect_to @downtown
  else
    render :new
  end
end
...