2013-12-18 2 views
0

У меня есть два класса Address и Review. В обзоре есть адрес, и адрес может иметь много отзывов. Я смоделировал это, сказав Review belongs_to Address и что Address has_many Reviews.Rails ActiveRecord - загружать только определенные связанные записи

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

Я установил маршрутизацию следующим образом: resources :addresses, only: [:new, :create, :show, :update], :as => :reviews, :path => :reviews, :controller => :reviews. Который позволяет мне иметь URL-адреса, такие как /reviews/[:id].

Каков наилучший способ для загрузки адреса и одного связанного обзора с id = [: id].

До сих пор я

@review = Review.find(params[:id]) 
@address = @review.address 

Но если я тогда сделать что-то вроде

@address.reviews 

Я считаю, что ActiveRecord загрузит все связанные обзорные не то, что я хочу, как я имею в виду обзора как основного объекта, который имеет адрес как часть его.

Неужели я запутался в своем дизайне? Концептуально an address is part of a review, но я не вижу какой-либо способ моделирования этого таким образом, что address can still have many review '

EDIT: Я думаю, что некоторые из моих путаницы исходит из того, что мои взгляды имеют формы, которые нужно взять адрес, потому что адрес имеет accepts_nested_attributes_for :reviews, что упрощает все проверки и создание форм.

Большое спасибо заранее!

+0

Я не понимаю, что проблема, которую вы пытаетесь адрес. Да, '@ address.reviews' вернет все отзывы, связанные с этим адресом, но почему это проблема для вас? Вам не нужно использовать эту конструкцию, если вы этого не хотите. –

+0

Это проблема, потому что в случаях использования приложения я только работаю с 1 адресом и 1 обзором. Я не хочу загружать все остальные обзоры. – KnownColor

+0

Почему, по вашему мнению, они будут загружены, если вы не включите '@ address.reviews' в свой код? –

ответ

1

Вы уже правильно имитировали imho.

Для вашей формы вы, скорее всего, хотите что-то вроде следующего:

= form_for @review do |f| 
    = f.body 
    = f.fields_for :address do |af| 
    = af.street 
    = af.city 

, а затем в модели обзора вы хотите: accepts_nested_attributes_for: адрес

+0

Спасибо! Я не понял, что метод accepts_nested_attributes_for будет работать «назад» по ассоциации. Теперь я могу использовать форму для обзора, а не адреса, и все гораздо проще. – KnownColor

+1

@KnownColor Это не «работает назад». отзыв принадлежит адресу, поэтому каждый отзыв указывает на (содержит идентификатор) адрес. –

+0

@PeterAlfvin Согласен :) – KnownColor

Смежные вопросы