我有一个俱乐部模型和一个会员模型,它们通过会员模型关联。换句话说
class Club < ActiveRecord::Base
has_many :members, :through => :memberships
end
class Member < ActiveRecord::Base
has_many :clubs, :through => :memberships
end
然而,当我尝试创建一个新成员并将其添加到俱乐部时,我收到一条错误消息,说俱乐部无效。
> club = Club.find(1)
> member = Member.new(:name => 'Member Name')
> member.clubs << club
> member.save
member.save
语句将返回false。看一下member.errors.messages,我找到了
> member.errors.messages
@messages={:clubs=>["is invalid"]}
真奇怪的是,我的开发环境(使用sqlite3)不会发生这种情况,但仅限于使用mySQL进行的EngineYard部署。
答案 0 :(得分:7)
我刚刚发现了自己的问题。我的俱乐部类包含一个虚拟属性:密码,仅在创建俱乐部时使用,否则应忽略。事实证明,由于一个错误,密码不会被忽略,并且在保存俱乐部关联时正在验证。所以吉姆斯图尔特的评论是正确的:俱乐部实际上是无效的,即使我认为它是。
在开发过程中没有出现问题的原因是我在开发环境中关闭了密码验证,因此我可以使用简单的密码进行测试。
答案 1 :(得分:3)
开发和生产中是否有memberships
表(即,到处都运行rake db:migrate
)?
您可能还需要像这样修改模型:
class Club < ActiveRecord::Base
has_many :memberships
has_many :members, :through => :memberships
end
class Member < ActiveRecord::Base
has_many :memberships
has_many :clubs, :through => :memberships
end
class Membership < ActiveRecord::Base
belongs_to :club
belongs_to :member
end