【问题标题】:Ruby on Rails four-way association treeRuby on Rails 四向关联树
【发布时间】:2013-09-06 00:59:19
【问题描述】:

大局:我正在创建一个应用程序来跟踪历史上的时间事件。我用四个主要模型设置它:用户、事件、故事和图像。这个想法是任何给定的用户都可以创建一个事件,并将故事和/或图像添加到他自己的事件或任何其他事件中。但是故事和图像总是附加到某个事件,并且任何其他模型都属于创建它的用户(用于过滤和编辑目的)

协会的一般结构是这样的:

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、通过:或 as:

我的问题是,这组关联是最优的,还是可以通过以不同的方式组合它们来改进?

【问题讨论】:

  • 我建议阅读 Polymorphic Associations
  • 仅当故事和图像必须同时属于事件用户时,多态关联才适用于此,事实并非如此。
  • Story 和 Image 实际上必须始终同时属于某个 Event 和 User。唯一的问题是,故事可能属于与创建它所附加的事件的用户不同的用户

标签: ruby-on-rails ruby associations model-associations


【解决方案1】:

您在正确的轨道上,但 storyimage 不应该属于 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.storiesuser.images

【讨论】:

  • 我明白了,很有趣。但最后一个问题:上面的 :through 设置是否意味着只有创建事件的用户才能拥有包含的故事和图像?因为这将是用户 A 创建事件的情况,但用户 B 添加了一个故事,用户 C 将两个图像附加到同一事件,每个缠绕模型然后属于不同的用户...
  • 我认为您将授权与数据模型混淆了。能够更新属性与模型关系无关。您可以想象让不同的用户将图像添加到 Event 的实例中,但只要它们属于同一事件,story.event.user 将始终相同。
  • 非常感谢@depa,试试看它是如何工作的!我猜 story.event.user 会和 story.user 不一样?
  • 现在,如果您确实希望故事和图像属于与活动所有者不同的用户,那么我们将讨论其他内容。
  • 哈哈,好的。然后您的初始关联将正常工作。也许只是在Event 中使用belongs_to :owner, :class_name =&gt; 'User',这样您就不会将它与其他类型的所有权混淆。
【解决方案2】:

尝试使用嵌套属性:

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 个级别

  1. 用户

  2. 事件

  3. 故事和形象。

就像rails cast 的样本一样,有 3 个级别(调查 - 问题 - 答案)。

查看上面的链接并观看part 2 以了解其工作原理。

或者您无法查看我的示例,但它适用于 2 个级别(主题 - 任务)。

链接here

使用帐号登录:duyet.vn@gmail.com/12341234

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多