Tag: activerecord

如何急切加载与current_user的关联?

我在我的Rails应用程序中使用Devise进行身份validation。 我想在我的一些控制器中急切加载一些用户关联的模型。 像这样的东西: class TeamsController < ApplicationController def show @team = Team.includes(:members).find params[:id] current_user.includes(:saved_listings) # normal controller stuff end end 我怎样才能做到这一点?

列“users.id”必须出现在GROUP BY子句中或用于聚合函数

关系: Item belongs to Product Product belongs to User 物品型号范围: scope :search, ->(search_term) { select(‘products.name, users.*, products.brand, COUNT(products.id)’) .joins(:product => :user) .where(‘users.name = ? OR products.brand = ?’, search_term, search_term) .group(‘products.id’) } 以上结果出现在以下SQL语句中: SELECT products.name, users.*, products.brand, COUNT(products.id) FROM “items” INNER JOIN “products” ON “products”.”id” = “items”.”product_id” INNER JOIN “users” ON “users”.”id” = “products”.”user_id” WHERE […]

如何测试ActiveRecord中哪些validation失败?

我有这样的模型: class User (2..5) end 我想测试一下这个validation: it “should not allow too short name” do u = User.new(:name => “a”) u.valid? u.should have(1).error_on(:name) end 但是它没有测试在name设置了哪种错误。 我想知道,如果是too_short , too_long ,或者其他一些validation失败了。 我可以在errors数组中查找消息文本,如下所示: u.errors[:name].should include(I18n.t(“activerecord.errors.models.user.attributes.name.too_short”)) 但是当我在locale文件中设置activerecord.errors.messages.too_short而不是特定于模型的消息时,这将失败。 那么,是否可以检查出现了哪种错误?

Rails – 活动记录:查找所有记录与某些属性has_many关联的记录

用户具有许多身份。 class User < ActiveRecord::Base has_many :identities end class Identity < ActiveRecord::Base belongs_to :user end 标识具有已confirmed:boolean列。 我想查询只有一个身份的所有用户。 此身份也必须证实为假。 我试过这个 User.joins(:identities).group(“users.id”).having( ‘count(user_id) = 1’).where(identities: { confirmed: false }) 但是这会使用一个身份confirmed:false用户返回confirmed:false 但如果确认为true,他们也可以拥有其他身份。 我只希望确认只有一个身份的用户:false,并且没有已确认属性为true的其他身份 。 我也试过这个,但显然它很慢,我正在寻找合适的SQL只在一个查询中执行此操作。 def self.new_users users = User.joins(:identities).where(identities: { confirmed: false }) users.select { |user| user.identities.count == 1 } end 如果这已经得到回答,我会提前道歉,但我找不到类似的post。

rails 3&activerecord:我是否需要采取特殊记录锁定预防措施来更新计数器字段?

每次显示用户的配置文件时,我们都会更新Users表中的整数计数器。 我开始考虑高并发情况,并想知道如果一群人在同一时间点击用户的个人资料页面会发生什么:rails / activerecord是否神奇地为我处理记录锁定和信号量? 或者我的应用程序是否需要显式调用某种机制,以避免在对我的更新方法进行并发调用时丢失更新事件? def profile_was_hit self.update_attributes :hitcounter => self.hitcount + 1 end 沿着这些方向,我什么时候应该使用像Users.increment_counter(:hit counter,self.id)这样的东西?

Rails has_many:through,null belongs_to,multiple belongs_to和belongs_to的删除?

我想知道我是否在正确的轨道上,如果rails允许这种事情。 User在Network具有一个Role 。 即“吉姆”是“学校”的“历史老师”。 Role具有位置(权力)和名称(标签)。 “吉姆”是“历史老师”(标签),但拥有会员或管理员,主管或其他(权力)的权力。 根据该Role , User可以查看Network所有Events ,无论他/她是否创建了这些事件。 即如果“吉姆”是“校长”(管理员),“吉姆”可以看到“南希”的“rest计划”,但如果“吉姆”是“历史老师”(成员)则不能。 User将Event创建为Network的Role 。 即“吉姆”在“学校”创建“课程计划”作为“历史老师”。 Event永远连接到该特定Network并且当前连接到该Role 。 如果User替换该Role其他User ,并且新User可以访问该Event ,我希望该Event持续存在。 即“汤姆”取代“吉姆”作为“历史老师”,并可以修改“课程计划”,因为他是“历史老师”。 “吉姆”无法再访问“课程计划”。 但是如果没有User附加到Role我也希望Event持续存在。 即“汤姆”被解雇并且没有当前替换,管理员仍然可以看到“课程计划”。 最后,如果删除了该Role ,则Event仍然存在,因为它连接到没有Role Network 。 模型如下,我使用CanCan进行授权,这些是我的问题: 角色可以缺少User ,还是需要创建一些通用的“无” User或“所有人” User ? Event可以错过Role吗? (可以belongs_to为null吗?) 将Event连接到Role和Network是好/坏设计? 有一个更好的方法吗? 如果User可以根据他/她的Role看到更多事件,他们通过Network或他们的Role有很多Events吗? 我在思考Network ,而Ability.rb会限制它。 User.rb class User :roles has_many :events, :through => :network # I would use CanCan to […]

Rails-y查询具有belongs_to关联的模型的方法

我有两个型号: class Wine belongs_to :region end class Region has_many :wines end 我试图使用#where方法,通过将params哈希中的某些元素转换为查询哈希来构建哈希,例如{ :region => ‘2452’ } def index … @wines = Wine.where(hash) … end 但是我得到的只是在执行查询时列不存在错误: ActiveRecord::StatementInvalid: PGError: ERROR: column wines.region does not exist LINE 1: SELECT “wines”.* FROM “wines” WHERE “wines”.”region” =… 当然,表wines有region_id所以如果我查询region_id而不是我不会得到错误。 问题如下: 是否有一种rails-y方式使用#where方法中的id查询Wine对象的特定regions ? 我根据我所知道的可以做的,列出了以下一些选项。 选项1:我可以改变构建查询哈希的方式,以便每个字段都有_id (如{ :region_id => ‘1234’, :varietal_id => ‘1515’ […]

Rails在调试控制台上查看activerecord sql语句

我在我的Rails 3.2应用程序中使用调试器 gem。 如何在调试控制台上查看活动记录方法调用的结果SQL语句? 例如:如果我在调试控制台上运行Product.all ,它会打印出所有产品。 我也希望看到”Select * from Products” 。 这可能吗? 编辑现在我更聪明(; p)活动记录还在活动记录关系对象上提供.to_sql方法,以检查它们对底层数据库运行的sql查询。

帮助rails活动记录查询(如子句)

我希望我的代码做两件目前没有做的事情 @students = Student.where([“first_name = ? OR middle_name = ? OR last_name = ?”, params[:query].split]) 工作。 (它说我应该传递4个参数,但我希望用户能够键入单词并在每个字段上找到这些单词并返回任何匹配项) 实际上使用Like子句而不是刚性相等的子句。 请帮忙。

Rails 4 HABTM自定义validation关联

我有一个简单的场景,但我似乎无法找到适用于Rails 4的任何建议的解决方案。我想简单地添加一个自定义validation器来检查我的HABTM关联之间存储的关联量。 更容易说和完成,令我惊讶? 我已经搜索了一个解决方案,但最终只得到了旧版本Rails的答案。 我有以下内容: class User 3 errors.add(:roles, ‘Users can only have three roles assigned.’) return false end end end class Role < ActiveRecord::Base has_and_belongs_to_many :users end 我使用after_save的原因是因为据我所知,存储的关联在添加之后首先可用。 我也尝试编写自定义validation器(例如, validate: :can_only_have_one_role ),但这也不起作用。 我以下面的方式添加关联,并在rails控制台中完成此操作(应该可以正常工作?): user.roles << role 然而,它为用户添加了多个角色,并不关心任何类型的validation。 非常感谢,谢谢!