ruby-on-rails - 您如何构造一个 Rails 模型,其中两个属性需要与另一个模型共享相同的关联?

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

我正在开发一个 Rails 应用程序,它汇集了艺术家对其他艺术家的评价,但我无法弄清楚我的数据模型中的关系应该如何工作。

以这句话为例。以下是 David Bowie 对 Lou Reed 的评价:

"He was a master"

在这个例子中,我的 Quote 模型的属性是这样的:

  • 摘录 => “他是一位大师”
  • 演讲者=>“大卫·鲍伊”
  • 主题 => “Lou Reed”

但是如果 Lou Reed 说了一些关于 David Bowie 的事情,例如:

  • 摘录 => “他是我 70 年代最好的 friend ”
  • 演讲者 => “Lou Reed”
  • 主题 => “大卫·鲍伊”

一位艺术家既可以是演讲者,也可以是引言的主题,但绝不是同一引语。我还希望用户能够创建新的艺术家,然后在创建报价时将这些显示为与报价相关联的选项(通过下拉菜单或搜索等)。

我似乎无法构建它,使报价通过演讲者有很多艺术家,因为它也可以通过主题有很多艺术家。

这是 Rails 惯用的结构方式吗:

Quote
has_one :speaker
has_one :subject

Speaker
has_many :artists
belongs_to_many :quotes

Subject
has_many :artists
belongs_to_many :quotes

Artist
belongs_to_many :speakers
belongs_to_many :subjects

最佳答案

我相信您希望 Quote 看起来像这样:

class Quote < ActiveRecord::Base
  belongs_to :speaker, class_name: "Artist"
  belongs_to :subject, class_name: "Artist"
  belongs_to :user

  validates :speaker, uniqueness: {scope: :subject}
  validates :subject, uniqueness: {scope: :speaker}

  ...

end

假设:

  • 用户(可能是 current_user 或类似的用户)正在创建报价并且报价属于该用户。
  • 艺术家是不同于用户的概念。也就是说,艺术家不一定是用户(引用可能以 David Bowie 作为主题,但 David Bowie 可能不是您系统的用户(特别是考虑到他和 Lou Reed 一样已经去世)。

这样,speakersubject 都被指定为 Artist 类。

唯一性验证确保 speaker 永远不是 subject ,反之亦然。 (您可能需要摆弄 validates 语句,因为我没有测试。)

在您的 Artist 模型中,您可能想要执行如下操作:

class Artist < ActiveRecord::Base
  has_many :spoken_quotes, class_name: "Quote", foreign_key: :speaker_id
  has_many :referencing_quotes, class_name: "Quote", foreign_key: :subject_id

  ...

end

这样,您可以执行以下操作:

Artist.find_by(name: 'David Bowie').spoken_quotes

并获取大卫·鲍伊作为演讲者的所有名言

并且,在您的 User 模型中,您可能需要这样的东西:

class User < ActiveRecord::Base
  has_many: :quotes

  ...

end

这样你就可以做类似的事情:

current_user.quotes

并获取 current_user 创建的所有报价。

关于ruby-on-rails - 您如何构造一个 Rails 模型,其中两个属性需要与另一个模型共享相同的关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214369/

相关文章:

ruby-on-rails - 使用 ActiveRecord::Serialization.to_xml 构建动态字段

ruby-on-rails - ActionView::Template::Error(nil:NilClass 的未定义方法 `city'):

ruby-on-rails - 根据 Ruby 版本管理 gem 依赖项

ruby-on-rails - 为使用acts_as_tree的资源构建嵌套路由

ruby - 在 Ruby 中传递一个将参数作为参数的方法

ruby-on-rails - Rails 丰富的关联

javascript - 嵌套的 XML 数据和 ExtJS 模型关联

ruby-on-rails - 为什么在 Gemfile 中包含一个 gem 可以解决 Railtie 问题,即使这个 gem 已经包含在 Gemfile.lock 中?

ruby-on-rails - Rails 嵌套 with_option :if used in validation

ruby-on-rails - 从另一个 gem 获取一个 gem 的 Assets