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 "
,但我仍然知道self
是ActiveRecord::Associations::JoinDependency::JoinAssociation
。但仅限于周五之后创建的帐户。在星期五之前创建的每个帐户都可以使用 proc 和 lambda。
@Isaac 你能显示在星期五之前和之后创建的帐户吗?我猜你可能缺少一些关联/依赖关系。
好的,所以我已经大大改变了这个问题。我认为这更好地解释了我的问题。我现在省略了另一个模型e.rb
,它工作正常,现在我只是比较更改前后的l.rb
,以及哪些帐户/l 的工作,哪些没有。
哦,抱歉,我才发现您要求提供帐户,帐户根本没有更改。它们的生成方式与以前完全相同,现在唯一的区别是 l.rb 已更改。
我的问题在于我们设置的过滤系统。我现在可以正常工作了。不过感谢您的帮助!以上是关于Ruby/Rails - 为啥自我关联条件取决于创建时间?的主要内容,如果未能解决你的问题,请参考以下文章
Ruby/Rails:将日期时间转换为自然语言(例如 2012 年 3 月 23 日到“本周五”)