我对rails很新,对数据库操作也很陌生。
我正在尝试在数据库中创建一个包含许多自定义对象的类。这些自定义对象也将存储在单独的表中的数据库中。我已设法将其设置如下
class MyClass < ActiveRecord::Base
has_many :other_objects, :dependent => destroy
end
class OtherObject < ActiveRecord::Base
belongs_to :my_class
attr_accessible :some_stuff...
end
我已经创建了相应的数据库表并设法使其正常工作。
现在我要做的是在我的班级中有(四个)“OtherObject”的特定实例,可以通过一些简单的标识符访问,例如
test = MyClass.new
...
test.instance_of_other_object.some_attribute = "blahblah"
这样就更新了关联对象的数据库条目。最好的方法是什么?
答案 0 :(得分:1)
has_many
关联设置了MyClass#other_objects
(和a bunch of other methods),以便您轻松使用相关记录。
你可能想要:
my_class.other_objects.each do |other_object|
other_object.update_attributes(:foo => 'bar')
end
如果您想要直接SQL更新,可以使用update_all
:
my_class.other_objects.update_all(:foo => 'bar')
<强>更新强>:
如果这是您需要的那种关联,您可以定义belongs_to
关联:
class MyClass < ActiveRecord::Base
has_many :other_objects, :dependent => :destroy
# uses :selected_other_object_id
belongs_to :selected_other_object, :class_name => "OtherObject"
end
my_class = MyClass.first
my_class.selected_other_object = other_object # Set the object.
# => #<OtherClass:...>
my_class.selected_other_object_id # ID has been set.
# => 10
my_class.selected_other_object # Retrieve the object.
# => #<OtherClass:...>
my_class.selected_other_object.save # Persist ID and other fields in the DB.
my_class = MyClass.find(my_class.id) # If you fetch the object again...
# => #<MyClass:...>
my_class.selected_other_object_id # The ID is still there.
# => 10
my_class.selected_other_object # You have the ID, you get the object.
# => #<OtherClass:...>
my_class.selected_other_object.foo = "bar" # Access associated object this way.
another_variable = my_class.selected_other_object # Or this way.
但请记住,这并不是假设:selected_other_object
是:other_objects
的子集。
另请注意,在设置关联时已经设置了selected_other_object
和selected_other_object=
方法,因此您无需自己定义这些方法。
答案 1 :(得分:0)
这不是一个完整的答案,但我想出了一些适用于获取对象的东西,但不是用于设置它。
class MyClass < ActiveRecord::Base
has_many :other_objects, :dependent => destroy
def particular_instance
return OtherObject.find_by_id(self.particular_instance_id)
end
end
我的数据库架构看起来像这样
create_table "my_classs", :force => true do |t|
t.integer "particular_instance_id"
end
create_table "other_objects", :force => true do |t|
t.integer "my_class_id"
t.string "some_attribute"
end
<强>更新强> 为了设置other_object类的属性,可以使用update_attributes方法
my_class.particular_instance.update_attributes(:some_attribute => "blah")
答案 2 :(得分:0)
现在将object.dup
用于rails 3.1及其上。
a = MyClass.first # finds the first instance of the model "MyClass"
b = a.dup # duplicates the record.
c = a.dup # duplicates the record again.
b.field_name = "blahblah"
c.fielf_name = "blahblah"
b.save # saves the record into the database for object b.
c.save # saves the record into the database for object c.
如果查看数据库,可以看到已创建新记录。它与第一条记录完全相同,只有新ID 。
另请查看Duplicate a model以获取有关它的更多信息。