Ruby on rails 通过未保存的模型建立一个Has One-to vs Has multi-to

Ruby on rails 通过未保存的模型建立一个Has One-to vs Has multi-to,ruby-on-rails,ruby-on-rails-3,associations,has-many-through,has-one-through,Ruby On Rails,Ruby On Rails 3,Associations,Has Many Through,Has One Through,我写了一个gem,它允许谷歌电子表格转换成Rails模型。这个过程的顺序包括创建所有模型,然后连接它们的关联,然后保存所有模型。它支持所有可用的关联类型,在每种情况下,创建模型、建立关联,然后保存模型都可以正常工作。例外情况如下: 我有一个简单的has_one,通过关联(为简洁起见省略了属性访问): 类左

我写了一个gem,它允许谷歌电子表格转换成Rails模型。这个过程的顺序包括创建所有模型,然后连接它们的关联,然后保存所有模型。它支持所有可用的关联类型,在每种情况下,创建模型、建立关联,然后保存模型都可以正常工作。例外情况如下:

我有一个简单的
has_one,通过
关联(为简洁起见省略了属性访问):

类左
我发现一些不一致的行为取决于协会的哪一方:

从右向左分配:

left = Left.new
right = Right.new
left.rights << right
left.middles #[]
right.middle #nil
left.save!
left.middles # <Middle theme_id: 1, archive_resource_id: 1 >
left = Left.new
right = Right.new
right.left = left
left.middles #[]
right.middle <Middle theme_id: nil, archive_resource_id: nil >
right.save!
right.middle # <Middle theme_id: nil, archive_resource_id: 1 >
left=left.new
右=右。新

left.rights我认为它可能正在工作,但不会立即更新。调用关联方法时,请尝试传递
true
。例如,
右。中(真)
。这将迫使Rails返回数据库以获取记录,而不是检查过时的缓存。不过,不要在新记录上执行此操作,因为这样会吹走内存中的关联对象

为避免强制重新加载,请在关联上设置<代码>反向

class Left < ActiveRecord::Base
   has_many :middles, dependent: :destroy, inverse_of: :left
   has_many :rights, through: :middles
end

class Right < ActiveRecord::Base 
   has_one :middle, dependent: :destroy, inverse_of: :right
   has_one :left, through: :middle
end

class Middle < ActiveRecord::Base
  belongs_to :left, inverse_of: :middles
  belongs_to :right, inverse_of: :middle
end
类左
inverse\u的
使
模型
了解关联模型与自身的关系,这允许它在持久化和加载关联对象方面“智能化”。

根据Rails API文档()-

如果您在联接模型上使用的是“属于”,则最好 将选项的:inverse\u设置为所属,这将意味着 以下示例正常工作(其中标记为has_many:through) 协会):


所以@Kaleidoscope建立的关联实际上是正确的。

我认为它不起作用,因为你有

有很多-有一个吗

左与右之间的关系,而不是

你有很多属于你的东西吗

另一方面

属于:左,通过::中间

这是不可能的。所以您应该自己使用delegate作为getter和write setter方法,类似这样

class Right < ActiveRecord::Base 
  has_one :middle, dependent: :destroy
  delegate :left, to: :middle

  def left=(left)
    #logic
  end
end
class-Right
If
Left
Right
模型也继承自
ActiveRecord::Base
?还有为什么
左侧
型号
有很多:右侧
?也许应该是
有很多:权利
或者
有一个:权利
?@freemanoid抱歉,是的,它们是(有问题的修改)。
有很多:中间人
有很多:权利
@Teeg我需要中间人的属性。“我已经删除了这个问题中任何多余的内容。”蒂格。谢谢好建议。这是如此令人沮丧,因为在其他任何情况下,一切都完美地工作。不幸的是,
通过
关联不支持
的反向:请看:呃,是的。很抱歉很晚了,没问题。投票否决,所以很明显这个答案是不正确的。如果您使用的是
build
,这可能是正确的,但正如问题中所述,我使用的不是
build
,而是
new
,然后
保存
@万花筒的回答是不正确的,因为他在另一个方向上使用了
倒数:
有一个:中间的,依赖的::破坏的,倒数的::对的
使用
有很多,通过
或者
有一个,通过
有什么不对?两者都有明确的记录。
class Right < ActiveRecord::Base 
  has_one :middle, dependent: :destroy
  delegate :left, to: :middle

  def left=(left)
    #logic
  end
end