Tag: activerecord

问题:activerecord(rails3),链接范围包含

在Rails3中,链接两个范围(ActiveRelations)时似乎存在问题,每个范围都有不同的include: 考虑这两个范围,这两个范围都可以自行运行: 第一范围: scope :global_only, lambda { |user| includes(:country) .where(“countries.area_id ?”, user.area) } Work.global_only(user)=>(从SQL中删除字段列表以便易读) SELECT * FROM “works” LEFT OUTER JOIN “countries” ON “countries”.”id” = “works”.”country_id” WHERE (countries.area_id 3) 现在是第二个范围: scope :not_belonging_to, lambda { |user| includes(:participants) .where(“participants.user_id ? or participants.user_id is null”, user) } Work.not_belonging_to(user)=>(从SQL中删除字段列表以便易读) SELECT * FROM “works” LEFT OUTER JOIN “participants” ON “participants”.”work_id” […]

触发依赖::使用重写的destroy-destroy进行破坏

在我们的应用程序中,我们重写了ActiveRecord destroy方法,以便我们的记录不会被删除(因此用户可以取消删除)。 像这样: def destroy self.is_deleted = true self.save freeze end 然而,这似乎已经禁止了我们has_many关系的依赖性破坏。 换句话说,如果在父对象上调用destroy ,则has_many的子对象不会被销毁(它们不会被删除,即DELETE… ‘,也不会被覆盖的destroy -method被调用)。 如何触发子对象的销毁。 谢谢!

根据多个列删除重复记录

在我们的系统中,我们从外部数据库运行每小时导入。 由于导入脚本中的错误,现在存在一些重复记录。 如果任何记录具有相同的副本,则视为副本:legacy_id和:company 。 我可以运行哪些代码来查找和删除这些重复项? 我正在玩这个: Product.select(:legacy_id,:company).group(:legacy_id,:company).having(“count(*) > 1”) 它似乎返回了一些副本,但我不确定如何从那里删除? 有任何想法吗?

在Rails ActiveRecord中分配给布尔字段时如何转换值?

我的问题的简短版本 在Rails ActiveRecord中,如果我有一个布尔字段并且我给它分配了类似“ abc ”或2东西,那么它会立即转换为false 。 值1为true , nil保持为nil 。 为什么会这样? 我在哪里可以找到解释此行为的Rails文档(或Ruby文档)? 我的问题的长版本 我很难理解Rails如何处理为Rails模型中的Boolean字段赋值的尝试。 例如,假设我有一个Website模型,其中包含一个名为:domain的String字段和一个名为:can_ssl的Boolean字段。 我的迁移看起来像这样: class CreateWebsites false t.timestamps end end end 在我的模型文件中,我添加了一些validation规则,所以它看起来像这样: class Website true validates :can_ssl, :inclusion => { :in => [true, false] } end 很简单。 基于我所做的,我期待 :can_ssl只能设置为值true或false ,而不是其他任何东西。 还有其他什么会导致valid? 是false 。 但是一旦我开始在控制台中玩游戏,我注意到,早在实际的赋值语句中,我提供的值正在重新转换为true或false (或nil )。 有关如何将值转换为Boolean值的规则是什么? 控制台的示例: w = Website.new w.domain = […]

在ActiveRecord上使用setter覆盖问题

这不是一个问题,而是在Rails的Active Record上,当属性是对象时,我是如何解决write_attribute问题的。 我希望这对面临同样问题的其他人有用。 让我举个例子来解释一下。 假设您有两个类, Book和Author : class Book < ActiveRecord::Base belongs_to :author end class Author < ActiveRecord::Base has_many :books end 非常简单。 但是,无论出于何种原因,您需要覆盖Book上的author =方法。 由于我是Rails的新手,我遵循了Sam Ruby关于使用Rails进行敏捷Web开发的建议:使用attribute_writer私有方法。 所以,我的第一次尝试是: class Book < ActiveRecord::Base belongs_to :author def author=(author) author = Author.find_or_initialize_by_name(author) if author.is_a? String self.write_attribute(:author, author) end end 不幸的是,这不起作用。 这就是我从控制台得到的: >> book = Book.new(:name => “Alice’s Adventures in […]

与同一模型的多个has_many关系

我有一个可以创建post的模型用户 User has_many :posts Post belongs_to :user 但是,我还想让用户将post保存为书签。 所以我添加了以下内容: Bookmark belongs_to :post belongs_to :user User has_many :posts has_many :posts, :through => :bookmarks Post belongs_to :user has_many :posts, :through => :bookmarks 这不可能是正确的,因为当我执行@ user.posts时,它现在是不明确的。 这是指用户撰写的post还是用户collections的post? 你是如何解决这个问题的?

Rails用范围扩展字段,PG不喜欢它

我有一个小部件模型。 窗口小部件属于商店模型,属于区域模型,属于公司。 在公司模型中,我需要找到所有相关的小部件。 简单: class Widget {:area => :company}).where(:companies => {:id => company.id}) end end 这将生成这个美丽的查询: > Widget.in_company(Company.first).count SQL (50.5ms) SELECT COUNT(DISTINCT “widgets”.”id”) FROM “widgets” LEFT OUTER JOIN “stores” ON “stores”.”id” = “widgets”.”store_id” LEFT OUTER JOIN “areas” ON “areas”.”id” = “stores”.”area_id” LEFT OUTER JOIN “companies” ON “companies”.”id” = “areas”.”company_id” WHERE “companies”.”id” = 1 => 15088 […]

在Ruby on Rails中生成具有多对多的模型

有没有办法生成一个预定义的多对多关系的Rails模型? 事实上我知道如何将它添加到Active Record中,但是在DB迁移和Active Record模型中定义它是很好的。

如何在Active Record / Rails 4迁移中创建具有唯一索引的新表

如何通过rails迁移创建新表,并为其添加唯一索引? 在文档中,我发现如何在创建表后为表添加索引,但是如何在同一个迁移文件中同时创建表并添加唯一索引?

如何在ruby-on-rails中覆盖通用的activerecord错误消息?

在我的en.yml翻译文件中,我有: activerecord: errors: template: header: one: “1 error prohibited this {{model}} from being saved” other: “{{count}} errors prohibited this {{model}} from being saved” 在登录我的应用程序期间发生activerecord / validation错误时,错误消息: “1错误禁止保存此用户会话” 显示(其中user_session是正在使用的模型)。 我宁愿让它说出像 “发生了一次错误,导致您无法登录自己的帐户”。 如何使用我的特定错误消息覆盖常规错误消息?