Rails ActiveRecord定义其他对象中的数据库对象

时间:2013-02-18 11:26:01

标签: ruby-on-rails-3 activerecord

我对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"

这样就更新了关联对象的数据库条目。最好的方法是什么?

3 个答案:

答案 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_objectselected_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以获取有关它的更多信息。