协会在两个方面都不起作用

时间:2013-11-12 15:58:08

标签: mysql ruby-on-rails ruby activerecord ruby-on-rails-4

问候好人!

我想通过另一个模型链接2个模型:

class Article < ActiveRecord::Base
  ...some callbacks...

  has_many :article_images, dependent: :destroy
  has_many :images, through: :article_images

  ...some methods...
end

class Image < ActiveRecord::Base
  ...some callbacks...

  has_many :article_images, dependent: :destroy
  has_many :articles, through: :article_images

  ...other methods...
end

class ArticleImage < ActiveRecord::Base
  belongs_to :article
  belongs_to :image
end

当我尝试使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;或create():

art = Article.find 2 #=> <Article id: 2, category: 14, template: 2, param: "2">    
art.images #=> <ActiveRecord::Associations::CollectionProxy []

img = Image.find 2 #=> <Image id: 2, filename: "testna2.jpg">   
art.images << img #=> <ActiveRecord::Associations::CollectionProxy [#<Image id: 2, filename: "testna2.jpg">]>

当我尝试以相反的方式执行此操作时会出现问题:

img = Image.find 2
img.articles #=> ArgumentError: wrong number of arguments (1 for 0)

我甚至没有来到我将图像对象分配给文章的部分,看起来关联只能在一个方向上工作 - art.images返回一个集合,但img.articles会导致错误。

这是我的架构的关键部分(使用mySQL):

create_table "articles", force: true do |t|
  t.integer "category"
  t.integer "template"
  t.string  "param"
end

create_table "article_images", force: true do |t|
  t.integer "article_id"
  t.integer "image_id"
  t.string  "lang"
  t.string  "title"
  t.text    "desc"
end

create_table "images", force: true do |t|
  t.string "filename"
end

这是跟踪(似乎问题不是由我的模型引起的?):

2.0.0p247 :023 > img.articles
ArgumentError: wrong number of arguments (1 for 0)
    from /home/ziga/.rvm/gems/ruby-2.0.0-p247@goopti-storefront/gems/activerecord-4.0.0/lib/active_record/associations/builder/association.rb:70:in `articles'
from (irb):23
from /home/ziga/.rvm/gems/ruby-2.0.0-p247@goopti-storefront/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
from /home/ziga/.rvm/gems/ruby-2.0.0-p247@goopti-storefront/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
from /home/ziga/.rvm/gems/ruby-2.0.0-p247@goopti-storefront/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'

有没有人知道发生了什么?起初我使用 has_and_belongs_to_many 连接文章和图像模型,但后来我认为最好包含一些额外列的第三个模型(除了ID)。现在这似乎不是一个好主意...

1 个答案:

答案 0 :(得分:0)

好的,看起来我发现了导致错误的原因,但我仍然不确定原因 - 我在我的代码中使用了 attr_accessor ,看起来问题就在于它的名字。< / p>

我改变了

attr_accessor :association

attr_accessor :assoc

我的问题突然消失了,虽然使用 @association 变量的方法甚至在我重命名之前就被注释掉了。

我仍然不确定 attr_accessor 如何影响模型和关联,但我认为“关联”可能是rails中的保留字(couldn'但是在任何列表中找到它。)

如果有人遇到同样的问题,那么我建议你检查你的代码是否有可疑的attr_accessors或变量和方法名称。

我仍然无法对发生的事情做出最终结论,所以如果你认为你对此问题有所了解,请发表评论:)