Как я могу создать объект, если у него есть несколько принадлежащих ему объектов? - PullRequest
1 голос
/ 13 апреля 2011

У меня есть следующее:

class Org < ActiveRecord::Base 
  has_many :users              
  has_many :entries          
end

class Entry < ActiveRecord::Base
  belongs_to :org              
  belongs_to :user             
  validates_presence_of :entry_text
end

class User < ActiveRecord::Base
  belongs_to :org              
  has_many :entries          
  validates_uniqueness_of :user_name
  validates_presence_of :user_name, :length => { :minimum => 3 }
end

Я могу создавать организации и пользователей ... Как мне создать запись, если есть две принадлежащие_?и как называется этот шаблон?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

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

Ваш вопрос довольно широкий, но если вы укажете больше информации, люди смогут вам лучше помочь. Также я бы порекомендовал использовать гем Devise для вашей системы управления пользователями. Поскольку вы используете «пользователи», я бы предположил, что вы хотите, чтобы пользователи из orgs создавали записи. Созданная запись будет частью org, а пользователь будет текущим пользователем сеанса. Извините, если я ошибаюсь, предположив это.

Ваш файл rout.rb может выглядеть примерно так (при условии, что rails 3):

ресурсов: orgs do ресурсы: записи конец

Тогда создание вашего контроллера ввода будет выглядеть так:

@entry = @org.entries.new(params[:topic])
@entry.user = current_user #or however you are managing the current user's session.

И вы хотите установить org для всего класса, создав метод, который загружает вашу текущую org и выполняет before_filter: loadOrg

def loadOrg
   @org = Org.find(params[:id])
end

Это, конечно, при условии, что ваш путь выглядит примерно так: / org / (id) / entry / (entry_id)

а не

/ орг / (ID) / пользователь / (идентификатор_пользователя) / запись / (entry_id)

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

0 голосов
/ 13 апреля 2011

Я не вижу никаких проблем.

@entry = Entry.create(:entry_text => "Hello World!")

Теперь вопросы, чтобы уточнить, что вам нужно:

  • Может @entry принадлежит и org и user в то же время?Или он может принадлежать только одному из них?
  • Должен ли @entry принадлежать хотя бы одному из них?

Если @entry должен принадлежать только одному из них, то естьВы должны использовать Polymorphism

http://railscasts.com/episodes/154-polymorphic-association

class Entry < ActiveRecord::Base
  belongs_to :textable, :polymorphic => true
  validates_presence_of :entry_text
end

class Org < ActiveRecord::Base 
  has_many :users              
  has_many :entries, :as => :textable       
end

class User < ActiveRecord::Base
  belongs_to :org              
  has_many :entries, :as => :textable         
  validates_uniqueness_of :user_name
  validates_presence_of :user_name, :length => { :minimum => 3 }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...