2013-02-18 97 views
0

我是相對較新的軌道和數據庫操作非常新。Rails的ActiveRecord定義其他對象內的數據庫對象

我想在數據庫中創建一個類,其中包含一些自定義對象。這些自定義對象也將被存儲在數據庫中的一個單獨的表中。我已經設置如下

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" 

,使得該更新數據庫條目的關聯對象。什麼是最好的方式去做這件事?

回答

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=方法,因此您無需自己定義這些方法。

+0

這不是我正在尋找的。我想獲取並設置other_object的一個特定實例。所以my_class.this_special_object_that_i_can_refer_to_from_this_special_identifier.some_attribute =「whatever」 – 2013-02-18 11:54:12

+0

我更新了答案。它可能更接近你現在需要的東西。 – kristinalim 2013-02-18 12:21:37

+0

是的,它可以更新數據庫中的OtherObject。謝謝。但是,:selected_other_object本身並不存儲在數據庫中,因此無論何時首次在應用程序中使用時,它都需要指向數據庫中的條目。我還沒有想出一個這樣做的好方法 – 2013-02-18 13:04:21

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 

凡我DB模式看起來像這樣

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") 
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. 

如果你看看你的數據庫,你可以看到一個新的記錄已經創建。除第一條記錄外,它與新編號相同。

另請參閱Duplicate a model瞭解更多信息。

相關問題