Создайте объект Ruby с помощью has_many: through - PullRequest
0 голосов
/ 04 июля 2018

Предположим, у меня есть следующие модели:

class Course < ActiveRecord::Base
  has_many :contents
  has_many :topics, :through => :contents
end

class Topic < ActiveRecord::Base
  has_many :contents
  has_many :courses, :through => :contents
end

class Content < ActiveRecord::Base
  belongs_to :courses
  belongs_to :topics
end

Если я хочу создать курс и тему на месте, я бы сделал:

t1 = Topic.create(name: "Topic 1")
t2 = Topic.create(name: "Topic 1")
Course.create(name: "Course 1", topics: [t1, t2])

Это автоматически создаст запись Content. Если я добавлю дополнительный столбец к Content, скажем my_column, есть ли способ создать мой курс так же быстро, включая новый столбец Content?

Что-то вроде:

Course.create(name: "Course 1", topics: [(t1, my_column: 1), (t2, my_column: 2)])

1 Ответ

0 голосов
/ 04 июля 2018

ActiveRecord :: NestedAttributes - это то, что вы ищете.

Из документов

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

Я не могу проверить это прямо сейчас, но в конечном итоге вы сделаете что-то вроде

class Course < ActiveRecord::Base
    has_many :contents
    has_many :topics, :through => :contents
    accepts_nested_attribute_for :topics
end

class Topic < ActiveRecord::Base
    has_many :contents
    has_many :courses, :through => :contents
end

class Content < ActiveRecord::Base
    belongs_to :courses
    belongs_to :topics
end


t1 = Topic.create(name: "Topic 1")
t2 = Topic.create(name: "Topic 1")
course = Course.new(name: "Course 1")
course.topics << t1
course.topics << t2

course.save!

puts course.topics # ... t1, t2

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

...