Как я могу создать ассоциацию принадлежащую? - PullRequest
5 голосов
/ 18 декабря 2011

Я хотел бы посеять свои Products и назначить их конкретным User и Store.

Product.rb

class Product < ActiveRecord::Base

  belongs_to :user
  belongs_to :store

  def product_store=(id)
    self.store_id = id
  end
end

Примечание: Store относится к Business (:business_name)

Seed.rb

Это мои основные настройки:

user = User.create(:username => 'user', :email => 'user2@email.com') 
store = Store.create(:business_name => 'store', :address => 'Japan')

Я пытался это, но они не работали:

# This gives random ID's ranging from 1 to 4425!?
user.products.create([{:name => "Apple", :product_store => Store.find_by_address('San Francisco, USA')}])

# This gives me undefined method 'walmart'.
 user.store.products.create([ {:name => "Apple"} ])

Есть ли способ установить идентификаторы, чтобы я мог связать свои Products с Store и User?


ОБНОВЛЕНИЕ -

Я попробовал ответы ниже и все еще не получилось.Кто-нибудь знает другой способ сделать это?

Ответы [ 7 ]

8 голосов
/ 01 мая 2012

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

Из ваших оригинальных семян.рб

user = User.create(:username => 'user', :email => 'user2@email.com')
store = Store.create(:business_name => 'store', :address => 'Japan')

Создать магазин

Store.create({
  user_id: user.id
  store_id: store.id
}, without_protection: true)

В исходном коде объявлены переменные «user» и «store». Код назначает user_id / store_id (столбцы модели, определяемые отношением own_to в модели Store) значениям id, которые присутствуют в переменных user и store

"without_protection: true" отключает массовую защиту назначений в полях id. Это вполне приемлемо в файле seed, но его следует использовать с особой осторожностью при работе с данными, предоставленными пользователем.

2 голосов
/ 18 декабря 2011

Если я не ошибаюсь, вы просто пытаетесь это сделать.

user = User.create(:username => 'usertwo', :email => 'user2@email.com') 
walmart = Store.create(:business_name => 'Walmart', :address => 'San Francisco, USA')

user.products.create(:name => 'Apple', :store => walmart)

Что-нибудь еще требуется здесь, чего я не вижу?

2 голосов
/ 18 декабря 2011

Или, альтернативно, создайте свои магазины.

Затем извлеките правильный, например,

store = Store.find_by_business_name('Test Store')

, а затем создайте его на основе этого, например

store.products.create(:product_name => "Product Test", :price => '985.93')

установить идентификатор отношения для вас,

1 голос
/ 15 января 2012

Что я сделал, чтобы обновить определенные продукты для определенного пользователя, посмотрите на этот вопрос:

Могу ли я обновить все свои продукты для определенного пользователя при заполнении?

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

Попробуйте сделать это

store_1 = Store.new(:business_name => 'Test Store',
:address => 'Test Address',
:phone_number => '555-555-555')

store_1.id = 1
store_1.save!

Хитрость заключается не в том, чтобы установить идентификатор в хэше, поскольку он защищен.

Scott

0 голосов
/ 07 сентября 2016

Попробуйте это:

User.destroy_all
Product.destroy_all

user = User.create!([{:username => 'usertwo', :email =>'user2@email.com'},
{:username => 'userthree', :email => user3@email.com}])

user.each_with_index do |obj, index|
  Product.create!([{ :product_name => 'product #{index}', :user_id => obj.id }])
end

Таблица будет выглядеть так:

enter image description here enter image description here

0 голосов
/ 19 декабря 2011

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

Другой подход Создайте начальные записи в своем Rails-приложении через GUI / web. Тогда используйте что-то вроде Yaml-db. Таким образом, вы можете записать данные в файл yaml. Теперь вы можете отредактировать этот файл (при необходимости) и использовать этот же файл для заполнения другого экземпляра БД с помощью «rake db: load»

В любом случае .... Вы знаете, что идентификаторы не будут смещаться вокруг вас, когда эти объекты будут созданы в новом экземпляре БД.

Я уверен, что есть другие способы сделать это ... Возможно, даже лучше. Вот ссылка на статью, которую я сделал некоторое время назад для использования yaml_db для заполнения базы данных оракула. http://davidbharrison.com/database_seeding_oracle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...