如何为belongs_to关联播种?

时间:2011-12-18 10:09:44

标签: ruby-on-rails ruby ruby-on-rails-3

我想为Products种子并将其分配到特定的UserStore

Product.rb

class Product < ActiveRecord::Base

  belongs_to :user
  belongs_to :store

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

注意:Store belongs_to 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"} ])

有没有办法设置ID,以便我可以将ProductsStoreUser相关联?


更新 -

我已经尝试了下面的答案,但仍然没有成功。有没有人知道另一种方法呢?

7 个答案:

答案 0 :(得分:8)

虽然听起来你找到了解决方法,但解决方案可能对其他人感兴趣。

来自您原来的种子.rb

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(由Store模型中的belongs_to关系推断的模型列)分配给“user”和“store”变量中存在的id值。

“without_protection:true”关闭id字段的批量分配保护。这在种子文件中是完全可以接受的,但在处理用户提供的数据时应该非常谨慎使用。

答案 1 :(得分:2)

如果我没弄错的话,你只是想这样做。

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 :(得分:1)

尝试这样做

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

store_1.id = 1
store_1.save!

诀窍是不要在哈希中设置id,因为它受到保护。

斯科特

答案 3 :(得分:1)

我所做的是将特定产品更新为某个用户,请参阅此问题:

Can I update all of my products to a specific user when seeding?

答案 4 :(得分:0)

您可以为此&#34;种子迁移&#34;创建一系列插入声明,包括每个用户,商店,产品等的记录ID。您可能必须在此方法后更新数据库序列。

另一种方法 通过GUI / web在您的Rails应用程序中创建初始记录。 然后使用像Yaml-db这样的东西。因此,您可以将数据转储到yaml文件。您现在可以编辑该文件(如果需要)并使用相同的文件为数据库的另一个实例设置种子&#34; rake db:load&#34;

无论哪种方式....你知道当在新的数据库实例中创建这些对象时,ID不会转移到你身上。

我确定还有其他方法可以做到这一点......甚至可能是更好的方法。 这是一篇关于使用yaml_db为oracle数据库播种的一段时间的写作链接 http://davidbharrison.com/database_seeding_oracle

答案 5 :(得分:0)

试试这个:

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

答案 6 :(得分:0)

这是我更喜欢在 Rails 6 中建立关联的方式

@teacher = Teacher.new(name: "John")
@student = @teacher.build_student(name: "Chris")

@teacher.save!
@student.save!