Как получить доступ к ссылочной таблице в отношении n: m в Ruby on Rails? - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть такая база данных:

    users
    -id

    user_cars
    -user_id
    -car_id

    cars
    -id
    -model
    -color

Таким образом, у пользователя может быть несколько машин, а подробная информация об автомобилях находится в таблице больших машин.Я также создал модели со связями.

class User 
has_many :user_cars

class User_car
belongs_to :user
belongs_to :cars

class Car
has_many :user_cars

Теперь я хочу получить доступ к информации обо всех автомобилях для одного пользователя.Мой первый подход заключается в том, чтобы получить хотя бы одну информацию (т.е. цвет) из таблицы машин.

Я попробовал эту, просто как пример для доступа к средней таблице:

@user_id = current_user.user_cars.find(1).user_id

работает!Но когда я пытаюсь получить доступ к таблице автомобилей, я всегда получаю сообщение об ошибке.

@color = current_user.user_cars.cars.find(1).color

undefined method `cars' for #<ActiveRecord::Relation:0xaf92e8c>

Поэтому я думаю, что я делаю что-то легкое, очень неправильное ...

Когда я знаю, как получить доступ ктретья таблица, я должен сделать это таким образом, чтобы я получал результаты только для пользователя, а не только для первой записи, может быть, вы, ребята, можете помочь мне с этим.Спасибо!

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Без has_many: через ассоциации:

@color = current_user.user_cars.where(:car_id => 1).first.color

С ними:

class User < ActiveRecord::Base
  has_many :user_cars, :foreign_key => :user_id, :class_name => "UserCar", :inverse_of => :user
  has_many :cars, :through => :user_cars
end

class UserCar < ActiveRecord::Base
  belongs_to :user
  belongs_to :car
end

class Car < ActiveRecord::Base
  has_many :user_cars, :foreign_key => :car_id, :class_name => "UserCar", :inverse_of => :car
  has_many :cars, :through => :user_cars
end

@color = current_user.cars.find(1).color

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

  • : сквозное определение ярлыка
  • : inverse_of определяет метод (ассоциацию), который представляет текущую модель в: class_name модель
  • : имя_класса определяет, какая модель должна быть представлена: user_cars
  • : foreign_key сообщает, какой столбец в таблице целевой модели представляет текущую модель (в таблице user_cars (или users_cars, зависит от того, как вы определяете ассоциацию, я думаю, что в этом примере это должны быть user_cars .. и users_cars для has_and_belongs_to_many)

Подробности об этом в ссылке выше.

1 голос
/ 10 декабря 2011

Кстати, проблема в вашем примере в том, что assign_to должен быть в единственном числе.Кроме того, ваш заказ был неправильным.

@color = current_user.user_cars.find_by_car_id(1).car.color

Вы должны переписать это, чтобы использовать ассоциацию has_many через :

class User 
has_many :user_cars
has_many :cars, :through => :user_cars

class UserCar
belongs_to :user
belongs_to :car

После этого вы можете получить доступ к автомобилям:

current_user.cars

И цвет, выполнив:

@color = current_user.cars.find_by_car_id(1).color

РЕДАКТИРОВАТЬ

После некоторой отладки, оказывается, что модель автомобиля имеетсвойство класса.Класс - зарезервированное слово в рубине.Будьте осторожны с именами ваших атрибутов!

...