Rails 关联不保存
Posted
技术标签:
【中文标题】Rails 关联不保存【英文标题】:Rails assocation not saving 【发布时间】:2012-06-19 05:07:51 【问题描述】:我有以下课程:
class Group < ActiveRecord::Base
has_many :users
belongs_to :leader, :foreign_key => "leader_id", :class_name => "User"
def get_leader!
if leader.try(:is_active?)
return leader
else
leader = users.active.sort_by |u| u.completed_sessions .last
save! # TODO: this does not save the new leader ... no idea why
return leader
end
end
end
当我调用 get_leader 时!方法它总是返回正确的领导者,但无法更新对象的foreign_key 'leader_id'。
从我的实际代码注释中可以看出,我不知道为什么。当我转到控制台并明确设置组的领导者时,一切似乎都正常。
有人知道为什么会这样吗?
(顺便说一句,该方法的目的是在前一个领导者变为非活动状态时更新组的领导者。新领导者是登录次数最多的领导者。)
【问题讨论】:
【参考方案1】:尝试在leader
前面加上self:
self.leader = users.active.sort_by|u| u.completed_sessions.last
save!
这在 Ruby 赋值中是必需的,因为 Ruby 不知道 leader
是该方法的本地变量,还是对象 self
上的赋值方法。
另外,如果completed_sessions
是数据库列,我会考虑使用此代码来拉取正确的用户:
self.leader = users.active.order("completed_sessions DESC").first
这将使用您的数据库查询对数据库进行排序,而不是提取所有记录并让 Ruby 对它们进行排序 - 当您的用户数据库变得更大时效率更高。
【讨论】:
谢谢。我过去常常在任何地方都使用 self ,但后来我看到花哨的人忽略了它。感谢您的澄清。这是一个关于这个主题的好帖子:***.com/questions/4699687/… 是的,很遗憾,complete_sessions 不是数据库列,而是一种方法……但很好的提醒。以上是关于Rails 关联不保存的主要内容,如果未能解决你的问题,请参考以下文章
rails:关联表(has_and_belongs_to_many)不保存任何记录