新手问题 rails 数据库表多对多关系取数据问题

76521 · 2013年07月10日 · 最后由 stone 回复于 2014年11月06日 · 6066 次阅读

我有表 contacts,tags,对应关系是多对多,我按照约定,中间表为 contacts_tag,我在 model 中已经建好了关系 as_and_belongs_to_many:contacts/has_and_belongs_to_many:tags 但是我在 contact 的 view 中怎么取不到 tag 的数据, =contact.tags.name 在页面上显示的数据是这个 ActsAsTaggableOn::Tag,怎么回事啊这是

多对多的话,contact.tags 是一个数组,直接取 name 的话应该是不正确的。试试:contact.tags.pluck(:name)

#1 楼 @reyesyang 不行啊,没数据啊,

#2 楼 @76521 改为 contact.tags.inspect 的话,页面会输出什么呢?

#3 楼 @reyesyang 没东西,直接一个空数组 [],我数据库中都存数据了没错

这个就表示没有和该 contact 关联的 tag,在 rails console 再确定下结果。如果还是空,就检查你的数据吧,可能是外键的值不正确。

#5 楼 @reyesyang 你看这是我 contact 跟 tag 的 model 没错吧? 这是中间表。 这地方的名字没错吧

#6 楼 @76521 contact.rb 中多对多关联声明的 :polymorphic_tags 改为 :tags 呢?

#7 楼 @reyesyang 我试了也不行,如果我改成 contact.tags.name 的话页面显示的居然是 ActsAsTaggableOn::Tag 这个,怎么会显示成了 Tag 所继承的那个类了啊?是不是 Tag 类所继承的那个地方有问题啊?

#8 楼 @76521 开一个 rails console,运行下面的代码,看看生成的 SQL 语句和查询结果:

contact = Contact.find 1
contact.tags

试试,看什么结果

contact = Contact.find 1 contact.contacts_tags

#11 楼 @hicupp 报错 NoMethodError: undefined method `contacts_tags' for #Contact:0x4bd3c68

目测你中间表的文件名和类名都错了,tag 少了个 s 噢,看错了,那是你的 migration

#13 楼 @blacktulip 恩,他总是要去 inner join tagging 这个表,貌似我建的那个中间表不管用啊?

class Contact < ActiveRecord::Base
    has_many :contacts_tags
    has_many :groups, :through => :contacts_tags
end

class ContactsTag < ActiveRecord::Base
    belongs_to :contact
    belongs_to :tag
end

class Tag < ActiveRecord::Base
    has_many :contacts_tags
    has_many :contacts, :through => :contacts_tags
end

用这样的方式试试,不推荐 has_and_belongs_to_many

需要 登录 后方可回复, 如果你还没有账号请 注册新账号