【问题标题】:Struggles with has_many and belongs_to association when relationships are 2-3 deep当关系深度为 2-3 时,与 has_many 和 belongs_to 关联作斗争
【发布时间】:2014-05-20 03:22:42
【问题描述】:

我对 Rails 和建立关联还很陌生,所以我怀疑我遗漏了一些非常明显的东西。我正在尝试设置一个应用程序,其中一个模型有两个模型,它 has_many 的。第二个模型属于第一个模型和第三个模型的 has_many。第三个可以属于第一个或第二个模型。

具体来说,我有一个墙模型,里面有图片和拼贴画。墙上可以放图片或拼贴画,也可以不放。拼贴可以放图片。

class Wall < ActiveRecord::Base
belongs_to :user
has_many :collages
has_many :pictures
end  

class Collage < ActiveRecord::Base
belongs_to :user
belongs_to :wall
has_many :pictures
end

class Picture < ActiveRecord::Base  
belongs_to :user
belongs_to :wall
belongs_to :collage
end

我得到的错误告诉我:

未定义的方法`图片?对于#Wall

我创建的关联有什么问题吗?

【问题讨论】:

  • 应该是Class Picture 和大P
  • 感谢您的更正 - 是一个错字,不是问题的根源。

标签: ruby-on-rails ruby activerecord associations


【解决方案1】:

has_many association 在任何模型上都会给出该方法的复数形式

因此 Wall 类有方法 #pictures 可用此行:

如果您希望#picture 方法可用,您应该使用关联作为belongs_to

如果您告诉您实际上是在哪里收到此错误以及您要实现的功能是什么,我们可以对确切的问题进行更多调试。

图片类的名称也应该是大写P

【讨论】:

    【解决方案2】:

    @cvibha 的回答应该对你的联想有所帮助

    但是,您可能还需要考虑另一个问题。您正在调用此方法:

    undefined method `picture?' for #Wall
    

    Rails 关联基本上根据您定义关联的方式创建记录(has_many :pictures 创建@wall.pictures)。然而,你打电话给picture?

    --

    如果您有一个名为 picture? 的自定义方法,这应该可以工作(尽管没有关联工作 - 如另一个答案中所述)。你的问题是我认为你没有定义picture?

    我会这样做:

    #app/models/wall.rb
    Class Wall < ActiveRecord::Base
        ...
        def picture?
            #your code
        end
    end
    

    或者,如果您希望验证图片是否存在,您可能希望在视图中使用:

    @wall.pictures.any?
    @wall.pictures.first.present?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 2023-03-29
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多