gpt4 book ai didi

ruby-on-rails - 如何避免 has_many :through relationship? 中的重复项

转载 作者:数据小太阳 更新时间:2023-10-29 06:25:43 25 4
gpt4 key购买 nike

我怎样才能实现以下目标?我有两个模型(博客和阅读器)和一个 JOIN 表,它允许我在它们之间建立 N:M 关系:

class Blog < ActiveRecord::Base
has_many :blogs_readers, :dependent => :destroy
has_many :readers, :through => :blogs_readers
end

class Reader < ActiveRecord::Base
has_many :blogs_readers, :dependent => :destroy
has_many :blogs, :through => :blogs_readers
end

class BlogsReaders < ActiveRecord::Base
belongs_to :blog
belongs_to :reader
end

我现在想做的是将读者添加到不同的博客。不过,条件是我只能将读者添加到博客一次。因此 BlogsReaders 表中不能有任何重复项(相同的 readerID,相同的 blogID)。我怎样才能做到这一点?

第二个问题是,如何获得读者尚未订阅的博客列表(例如,填写下拉选择列表,然后可以使用该列表将读者添加到另一个博客)?

最佳答案

内置于 Rails 中的更简单的解决方案:

 class Blog < ActiveRecord::Base
has_many :blogs_readers, :dependent => :destroy
has_many :readers, :through => :blogs_readers, :uniq => true
end

class Reader < ActiveRecord::Base
has_many :blogs_readers, :dependent => :destroy
has_many :blogs, :through => :blogs_readers, :uniq => true
end

class BlogsReaders < ActiveRecord::Base
belongs_to :blog
belongs_to :reader
end

注意将 :uniq => true 选项添加到 has_many 调用。

此外,您可能还需要考虑在 Blog 和 Reader 之间使用 has_and_belongs_to_many,除非您希望在连接模型上具有其他一些属性(目前您没有)。该方法还有一个 :uniq 选项。

请注意,这不会阻止您在表中创建条目,但它确实确保在查询集合时您只获得每个对象之一。

更新

在 Rails 4 中,实现它的方法是通过作用域 block 。以上改为.

class Blog < ActiveRecord::Base
has_many :blogs_readers, dependent: :destroy
has_many :readers, -> { uniq }, through: :blogs_readers
end

class Reader < ActiveRecord::Base
has_many :blogs_readers, dependent: :destroy
has_many :blogs, -> { uniq }, through: :blogs_readers
end

class BlogsReaders < ActiveRecord::Base
belongs_to :blog
belongs_to :reader
end

Rails 5 更新

在范围 block 中使用 uniq 将导致错误 NoMethodError: undefined method 'extensions' for []:Array。使用 distinct 代替:

class Blog < ActiveRecord::Base
has_many :blogs_readers, dependent: :destroy
has_many :readers, -> { distinct }, through: :blogs_readers
end

class Reader < ActiveRecord::Base
has_many :blogs_readers, dependent: :destroy
has_many :blogs, -> { distinct }, through: :blogs_readers
end

class BlogsReaders < ActiveRecord::Base
belongs_to :blog
belongs_to :reader
end

关于ruby-on-rails - 如何避免 has_many :through relationship? 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/315792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com