Как я могу воспользоваться моими ассоциациями моделей в моем представлении и контроллере в Ruby on Rails 3? - PullRequest
1 голос
/ 10 мая 2011

Я новичок в Rails и пытаюсь настроить свои модели, и мне было интересно, как Rails обрабатывает ассоциации.

У меня есть объект квеста, который "принадлежит" или ссылается через внешние ключи на ряд других объектов, включая пользователя и контент:

quest.user_id  
quest.a_different_name_id  #this is a foreign key to a Content object

оба являются внешними ключами, ссылающимися соответственно на объект User и объект Content.

Пользователь и контент "has_many" квесты.

Я понимаю, что эта настройка позволяет мне делать такие вещи, как:

u = User.create #saves to database  
u.quests.build  #creates new Quest object with user id set to u.id  

Могу ли я сделать что-то в обратном направлении, например:

form_for @quest do |f|
    f.text_field :a_user_attribute            #an attribute of a User object
    f.text_field :a_different_name_attribute  #an attribute of a Content object

где форма имеет текстовые поля для атрибутов объектов, на которые объект Quest ссылается через свои внешние ключи, в отличие от наличия формы для фактических внешних ключей, поэтому в контроллере у меня есть:

@quest = Quest.new(params[:quest])

Является ли Rails достаточно умным, чтобы "охватить" определяемые моделью отношения внешних ключей и заполнить, а затем сохранить объекты User и Content и соответствующим образом установить внешние ключи в @quest для ссылки на вновь созданные объекты?

Может ли он сделать это, даже если внешний ключ для объекта Content имеет другое имя, чем content_id?

Надеюсь, это имеет смысл ... дайте мне знать, если я неясен.

1 Ответ

3 голосов
/ 10 мая 2011

Вы можете делать все, что вам нужно, с помощью функции «Вложенные атрибуты» в Rails http://guides.rubyonrails.org/2_3_release_notes.html#nested-attributes

Здесь вы можете найти помощник по формам http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

В основном вам нужно сделать следующее:

class User < ActiveRecord::Base
  has_many :quests
  accepts_nested_attributes_for :quests
  ...
end

class Quest < ActiveRecord::Base
  belongs_to :user
  ...
end

, затем в форме вы делаете следующее:

<%= form_for @user do |f| %>
  UserAttrA  : <%= f.text_field :a_user_attribute_a %>
  UserAttrB: <%= f.text_field :a_user_attribute_b %>
  <%= f.fields_for :quests do |qf| %>
    QuestAttrA  : <%= qf.text_field :a_quest_attribute_a %>
    QuestAttrB: <%= qf.text_field :a_quest_attribute_b %>
  <% end %>
  UserAttrC  : <%= f.text_field :a_user_attribute_c %>
  UserAttrD: <%= f.text_field :a_user_attribute_d %>
<% end %>

И ваш контроллер будет работать так же, как у вас выше.

Обратите внимание, что вы можете отобразитьПользовательские вводы до и / или после квестовых вводов.По сути, вы можете сделать так, чтобы форма в представлении выглядела так, как вы хотите.Но семантика на сервере должна быть согласованной.

...