Tag: activerecord

Rails 4 – 通过连接表条件查找对象

我有两个模型, User和Team ,它是一个many-to-many的连接表,名为Member 。 它的设置如下: #Team: has_many :members, dependent: :destroy has_many :users, through: :members #User has_many :members has_many :teams, through: :members #Member belongs_to :user belongs_to :team 我希望用户能够访问彼此的个人资料页面( controller: :users, action: :show )。 在个人资料页面上,我只想列出两个用户都是其成员的团队(他们也可以是不同团队的成员)。 我真的是这个: #UsersController def show @user = User.find(params[:id]) @teams = @user.teams.joins(:members).where(:members => { :user_id => current_user.id }) end 这不起作用(在某些情况下不显示任何团队,并且其他人显示错误的团队,总失败!) 那么,做我想要的正确方法是什么? 仅列出两个用户所属的团队?

ActiveRecord :: Base.transaction应该在哪里?

我有三种型号:List,Food和Quantity。 列表和食物通过数量通过has_many:through关联。 所以每个数量都有三个参数:food_id,list_id和amount(整数)。 我的目标是每次创建一个列表时创建一个新的数量(与该列表相关联)。 我希望使用事务执行此操作,以便必须成功创建所有对象,否则将不会。 我的主要问题是:我的代码应该在哪里写这个交易? 我认为它应该在List模型中,但我不确定; 如果它应该在List模型中,我不知道它在 List模型中的位置。 我认为它不应该在List控制器中,我在Mark Daggett的博客评论中找到了建议 ,它可能是一个独立的数据访问对象,但我不知道该怎么做。 其次:交易本身。 我很难判断我的错误是在交易中还是在其位置上。 如果它是相关的,我在另一个问题的答案之后得到了这个问题,但我认为这应该是一个新问题,因为我没有找到一个特别关于交易的类似问题。 我的列表模型,当前交易所在的位置: class List :quantities before_save { self.name = name.downcase } validates :days, presence: true, :numericality => { :greater_than => 0 } validates :name, length: { maximum: 140 }, uniqueness: { case_sensitive: false } end ActiveRecord::Base.transaction do @list = List.create @a […]

PGError:错误:对象的AR查询及其has_many对象的WHERE子句中不允许聚合

在has_many关联上运行以下查询。 建议has_many批准。 我正在运行rails 3和PostgreSQL: Recommendation.joins(:approvals).where(‘approvals.count = ? AND recommendations.user_id = ?’, 1, current_user.id) 这将返回以下错误: https : //gist.github.com/1541569

Rails ActiveRecord Eager Load需要很长时间

我正在使用热切加载来加入我的两个表 Model1.eager_load(:model2) Model1表有大约800行,并且有许多对其他表的引用。 每当调用该行时,加载显示信息的视图大约需要3分钟。 然后,我试着建立一个直接的Postgres连接并运行从急切加载生成的相同的SQL查询,并在50ms内完成。 为什么在ActiveRecord中花费的时间更长,无论如何我可以减少时间? 在控制台中,它会转到以下SQL查询(当然这是一个简化版本),并且在它继续并加载页面之前它会挂起大约3分钟。 SELECT model1.*, model2.* FROM model1 LEFT OUTER JOIN model2 ON model2 .foreign_key = model1.id

通过Active Record获取嵌套对象集合

我试图通过活动记录检索对象列表但没有成功 我有一个模型:商店有很多产品,产品有一个供应商 class Store < ActiveRecord::Base has_many :products end class Product < ActiveRecord::Base belongs_to :supplier belongs_to :store end class Supplier < ActiveRecord::Base has_many :products end 我想从这样的商店槽产品中获取供应商列表: self.products.supplier 这给了我一个来自ActiveRecord :: Relation的未定义的方法exception’供应商’ 我应该为此制作一个自定义查找器还是有更好的方法?

散列/数组到活动记录

我一直在寻找,但我似乎无法在任何地方找到这个问题。 在Rails 5.0.0.beta3中,我需要使用关联和它的记录对我的@record = user.records进行排序。 排序就是这样的。 @record = @record.sort_by { |rec| If user.fav_record.find(rec.id) User.fav_record(rec.id).created_at Else rec.created_at End 这只是我所做的一个例子。 但一切都很好。 问题:这会返回一个数组,而不是一个Active Record Class。 我已经尝试了一切来让它返回一个Active Record Class。 我已经将已排序的元素推送到ID数组并尝试按顺序提取它们,我已经尝试过映射。 我获得的每个结果都将我之前的活动记录转换为数组或哈希。 现在我需要它回到活跃的记录。 有谁知道如何将该活动记录的数组或散列转换回Active Record类?

检索具有空数组的记录时出现问题

我有一个大约100个用户的表,我也有一个用户ID数组。 我想要做的是显示所有不属于此用户ID数组的用户。 当我做这样的事情 User.where(‘id NOT IN (?)’, [9, 2, 3, 4]) 它成功返回用户id不属于该数组的记录。 但是,如果该数组是空的,那么 User.where(‘id NOT IN (?)’, []) 它不会返回任何用户,SQL查询看起来像这样 SELECT “users”.* FROM “users” WHERE (id NOT IN (NULL)) 有谁知道为什么会发生这种情况或者这可能是一个错误? 我正在使用Rails 3.2.5和PostgreSQL。

Rails gem rails3-jquery-autocomplete:如何查询多个字段

我正在使用这里找到的rails3-jquery-autocomplete gem: http : //github.com/crowdint/rails3-jquery-autocomplete 有关如何查询模型的单个属性的说明很明确,我可以毫无问题地完成这项工作。 但是,我的Person模型有两个我想要组合和查询的属性。 它们是first_name和last_name 。 我想将它们组合成一个名为full_name的伪属性。 目前,我收到此错误: ActiveRecord::StatementInvalid (SQLite3::SQLException: no such column: full_name: SELECT “people”.* FROM “people” WHERE (LOWER(full_name) LIKE ‘cla%’) ORDER BY full_name ASC LIMIT 10): 虽然我在Person模型文件中有以下方法,但Person模型没有full_name属性: def full_name “#{self.first_name} #{self.last_name}” end 如何修改Person模型文件,以便对full_name调用查询数据库以匹配first_name和last_name的组合?

在Rails 3中查找_or_create_by并更新以创建记录

我不确定我是否应该以这种方式更新记录,或者我是否遗漏了某些内容。 我有一个包含5列(不包括时间戳和id)的表,其中3个是不同的,2个将更新。 我将找到或创建的3个不同的是room_id,date和source。 另外2个是可用的价格和点数(这些每小时,每天等变化) 我的问题是,如果我首先找到或创建记录,然后更新(或创建)价格和点数,或者我可以一次完成所有操作吗? 你现在可以看到我正在做的两种方式,而且我不确定它是否真的在做我期待的事情。 另外,像这样做find_and_create_by有什么缺点吗? 谢谢 private def self.parse_data(params,data) data.beds.each do |bed| room = Room.find_or_create_room(bed.title, params[:id]) #find clones somehow #puts bed.nights.first.price bed.nights.each_with_index do |night,index| available = Available.find_or_create_by_room_id_and_bookdate_and_source( :room_id => room.id, :bookdate => (params[:date].to_date)+index, :source => data.class.to_s#, #:price => night.price ) #available.price = night.price #available.spots = night.spots #available.save end end

Rails 4嵌套属性和has_many:通过表单中的associaton

我在管理has_many时遇到问题:通过使用表单进行关联。 我不想做的是编辑相关模型的属性,其中有大量信息,而我只想管理关联。 我理解我可以通过操作传递给我的操作的表单参数并手动构建关系来做到这一点,但我更愿意采用Rails方式,如果可能的话。 关于我的一个有趣的事情是,这个has_many:通过关联实际上是一个我已经使用accepts_nested_attributes_for保存的模型 以下是我的模型:目标,里程碑和程序。 class Goal true end class Milestone :milestone_programs end class Program < ActiveRecord::Base end 现在,在我的目标编辑视图中,我需要能够添加和删除里程碑,对于这些里程碑,我需要能够添加和删除程序关联。 这是我表单的代码。 f.object.id %> f.object.name %> – remove – remove 在我的控制器中,我有 class GoalsController [ :id, :name, :_destroy ]) end end 此表单必须像工作表一样,您可以在最后单击保存时进行更改并保存更改,因此我不相信诸如cocoon或nested_forms之类的gem会有所帮助。 到目前为止,我的代码完美地用于管理我的目标相关里程碑及其属性。 但现在我希望能够管理与这些里程碑相关的程序列表。 我尝试过使用accepts_nested_attributes_for,但这并不是我想要的,因为我不关心编辑模型的嵌套属性,程序属性是保持静态的。 我想我可能会在每个程序的表单中都有这样的东西来构建关联: 但这也不起作用(当然我已经添加了:program_ids到我列入白名单的参数)。 我需要添加到控制器的魔术轨道方法吗? 我在这里想念的是什么? 提前致谢!