Ruby/Rails - 为啥自我关联条件取决于创建时间?

Posted

技术标签:

【中文标题】Ruby/Rails - 为啥自我关联条件取决于创建时间?【英文标题】:Ruby/Rails - Why does self in association condition depend on time of creation?Ruby/Rails - 为什么自我关联条件取决于创建时间? 【发布时间】:2015-03-20 21:24:35 【问题描述】:

我正在尝试在关联条件下使用self。我不能简单地使用self,因为那样它将访问实际的类而不是实例(如this issue)。所以我有一个具有如下关联的类:

# l.rb on Friday before the changes
has_many :t_l_relationships, :inverse_of => :l, :dependent => :destroy
has_many :ts, 
  through: :t_l_relationships,
  dependent: :destroy

accepts_nested_attributes_for :ts

编辑后,添加了has_many :current_ts 关联,就是这样:

# l.rb after the changes
has_many :t_l_relationships, :inverse_of => :l, :dependent => :destroy
has_many :ts, 
  through: :t_l_relationships,
  dependent: :destroy

accepts_nested_attributes_for :ts
has_many :current_tenants, 
  source: :tenant,
  through: :tenant_lease_relationships,
  conditions: proc  "tenant_lease_relationships.tenant_role_id != #self" 

l.rb 中的self 在更改之前创建的accounts/l 总是计算为l 的实例。 l.rb 中的 self 用于帐户/l 的更改后总是评估为:#<ActiveRecord::Associations::JoinDependency::JoinAssociation:0x00000011f24fe8>。它是一个关联而不是 l 的一个实例。为什么会这样?

有人知道是什么原因造成的吗?还是在关联条件下访问类实例的另一种方式(如方法中的 self)?

我使用的是 Rails 3.2.11。

【问题讨论】:

【参考方案1】:

永远记住,proc 会捕获定义它的对象的当前作用域(包括自身和局部变量绑定)。请改用lambda

【讨论】:

Lambda 也是如此。起初我收到一个错误,说当我需要一个参数时我有 0 个参数。所以我添加了一个虚拟参数:lambda |l| " #self " ,但我仍然知道selfActiveRecord::Associations::JoinDependency::JoinAssociation。但仅限于周五之后创建的帐户。在星期五之前创建的每个帐户都可以使用 proc 和 lambda。 @Isaac 你能显示在星期五之前和之后创建的帐户吗?我猜你可能缺少一些关联/依赖关系。 好的,所以我已经大大改变了这个问题。我认为这更好地解释了我的问题。我现在省略了另一个模型e.rb,它工作正常,现在我只是比较更改前后的l.rb,以及哪些帐户/l 的工作,哪些没有。 哦,抱歉,我才发现您要求提供帐户,帐户根本没有更改。它们的生成方式与以前完全相同,现在唯一的区别是 l.rb 已更改。 我的问题在于我们设置的过滤系统。我现在可以正常工作了。不过感谢您的帮助!

以上是关于Ruby/Rails - 为啥自我关联条件取决于创建时间?的主要内容,如果未能解决你的问题,请参考以下文章

ruby Rails中的双向多语言关联

Ruby / Rails - 更改时间的时区,而不更改值

Ruby/Rails:将日期时间转换为自然语言(例如 2012 年 3 月 23 日到“本周五”)

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

Rails:从表单中嵌入和检索数组

ruby/rails:如何确定是不是包含模块?