全局:我正在创建一个应用程序来跟踪历史上的时间事件。我正在设置四个主要模型:用户,事件,故事和图像。这个想法是任何给定的用户都可以创建一个事件,并将故事和/或图像添加到他自己的事件或任何其他事件。但是故事和图像都始终附加到某个事件,任何其他模型都属于创建它的用户(用于过滤和编辑目的)
协会的一般结构是这样的:
class User < ActiveRecord::Base
has_many :events
has_many :stories
has_many :images
end
class Event < ActiveRecord::Base
belongs_to :user
has_many :stories
has_many :images
end
class Story < ActiveRecord::Base
belongs_to :user
belongs_to :event
end
class Image < ActiveRecord::Base
belongs_to :user
belongs_to :event
end
我是Rails的新手,我对很复杂的关联几乎没有控制权,因为many_to_many,或者作为:
我的问题是,这组关联是最优的,还是可以通过以不同的方式组合来改进?
答案 0 :(得分:2)
您走在正确的轨道上,但story
和image
不应属于user
。你正在那里创建一个冗余。
class User < ActiveRecord::Base
has_many :events
has_many :stories, :through => :events
has_many :images, :through => :events
end
class Event < ActiveRecord::Base
belongs_to :user
has_many :stories
has_many :images
end
class Story < ActiveRecord::Base
belongs_to :event
end
class Image < ActiveRecord::Base
belongs_to :event
end
这样您仍然可以撰写user.stories
和user.images
。
答案 1 :(得分:1)
尝试使用嵌套属性:
http://railscasts.com/episodes/196-nested-model-form-part-1
示例代码:
class User < ActiveRecord::Base
has_many :events
accepts_nested_attributes_for :events
end
class Event < ActiveRecord::Base
belongs_to :user
has_many :stories
has_many :images
accepts_nested_attributes_for :stories, :images
end
class Story < ActiveRecord::Base
belongs_to :event
end
class Image < ActiveRecord::Base
belongs_to :event
end
嵌套属性接受多个级别。在这种情况下,有3个级别
用户
事件
故事和形象。
它类似于rails cast的样本,有3级(调查 - 问题 - 答案)。
请查看上面的链接并观看part 2以查看其工作原理。
或者您无法查看我的样本,但它可以使用2个级别(主题 - 任务)。
的链接使用帐号登录:duyet.vn@gmail.com/12341234