Tag: activerecord

不明确的表格参考

这个问题看起来很简单,但我从未遇到过这样的问题。 以下是设置: Post has_many :reader_links Post has_many :readers, :through => :reader_links 我需要找出是否有读者阅读post。 @post.reader_links.where(‘created_at >= ?’, 45.minutes.ago).any? 效果很好。 @post.readers.where(‘created_at >= ?’, 45.minutes.ago),any? 抛出一个模糊的表列错误,因为create_at列是读取器对象还是reader_link对象是混淆的。 这是因为读者的类实际上是用户。 如何查询45分钟前由reader_links创建的读者? 我正在寻找像… @post.readers.where(‘reader_link.created_at >= ?’, 45.minutes.ago)

将ActiveRecord用于未命名为复数的表

我正在尝试使用基本的rails应用程序从MS SQL Server数据库中读取数据。 在我正在阅读的教程(下面的剪辑)中,它提到表格需要遵循某些规则,例如名称是复数和下划线等等。我的数据库中没有任何表遵循该约定,并且可以’改变。 这仍然是真的吗? 如果是这样,我需要阅读什么才能理解如何与这些表进行通信? SNIPPET http://coding.smashingmagazine.com/2009/03/27/ultimate-beginners-guide-to-ruby-on-rails/ 模型的结构和行为与数据库中的表之间的映射主要是完全自动化的,前提是您在表的设计中遵循一些规则。 一般原则是: 您的表名是您的类名的复数,下划线变体。 因此,类User将映射到表users.CookieRecipe将映射到cookie_recipes。 您的表需要将其主键放在名为id的整数列上,并带有auto increment属性。 与其他表的关联存储在以它们命名的列中。 如果要存储属于用户的post,则posts表需要user_id列

如何在rails中创建动态属性别名?

在类定义中,我得到了一个我想要返回的属性列表而不是数据库的值,除非这些值的存储容器是nil: class Label < ActiveRecord::Base CONFIRM_DATA = ["attr1", "attr2"] # "attr1", "attr2" is database fields CONFIRM_DATA.each do |att| alias_attribute "original_#{att}".to_sym, att.to_sym define_method att.to_sym do temp_attr_store[ att.to_sym ] || read_attribute( "original_#{att}".to_sym) end end end 如您所见,我尝试在temp_attr_store存储temp_attr_store一些临时值:它们应该出现而不是db值,并希望影响对象的关联。 上面的代码不起作用,所有attr1访问结果都是零。 谢谢!

我可以为belongs_to关联添加包含扩展吗?

我无法获得belongs_to关联以急切加载它的孩子。 我有: class User { includes :campaign_shirts, :arts, :selected_campaign_shirt } belongs_to :selected_campaign, {class_name: “Campaign”, inverse_of: :user}, -> { includes :campaign_shirts, :arts, :selected_campaign_shirt } end 这导致: // GOOD u.campaigns.first.campaign_shirts.first.to_s => “#” u.campaigns.first.campaign_shirts.first.to_s => “#” // NOT GOOD u.selected_campaign.campaign_shirts.first.to_s (queries db) => “#” (queries db) u.selected_campaign.campaign_shirts.first.to_s => “#” 我是否与这个问题发生冲突? 有没有办法实现我想要的,这是能够引用current_user.selected_campaign并有热切加载/冻结current_user.selected_campaign.campaign_shirts.first等?

从范围记录计算总数百分比并显示虚拟属性(Rails / Active Record)

创建一个范围,可能是这样的.. scope :mv, select(‘*,quantity*market_price as market_value, quantity*market_price/sum(quantity*market_price) as percent’) 这会创建两个虚拟属性,market_value和percent。 我遇到的问题是创建包含sum()的百分比。 如果我添加sum(),则范围返回一条记录。 我需要计算相对于范围记录集的总市值的market_value的百分比。 例: 1, market_value: 100, percent: .10 2, market_value: 100, percent: .10 3, market_value: 100, percent: .10 4, market_value: 100, percent: .10 5, market_value: 100, percent: .10 6, market_value: 500, percent: .50 Total is 1000 但是,如果我将其范围扩大到market_value <6,我应该看到 1, market_value: 100, percent: .20 2, […]

has_many通过与现有对象/ ActiveRecord的关联

给定模型 class Composition :compositions_tags end class Tag :compositions_tags validates_uniqueness_of :tag, only: [:create, :update], message: “already taken” end class CompositionsTag < ActiveRecord::Base belongs_to :composition belongs_to :tag end 现在,例如我 Composition.create(content: “Hello”).tags.create(text: “#hi”) 结果将是具有内容“Hello”的组合和已创建文本“#hi”的标签。 然后我再创一个作文。 Composition.create(content: “Goodmorning”) 现在我不知道和想要做的是将其与文本“#hi”的现有标签相关联。 我该如何以最优雅的方式做到这一点?

如何在Rails中基于外键列选择唯一记录?

我的Rails 4.1应用程序中有以下模型结构: delivery_service.rb class DeliveryService < ActiveRecord::Base attr_accessible :name, :description, :courier_name, :active, :country_ids has_many :prices, class_name: 'DeliveryServicePrice', dependent: :delete_all end delivery_service_price.rb class DeliveryServicePrice < ActiveRecord::Base attr_accessible :code, :price, :description, :min_weight, :max_weight, :min_length, :max_length, :min_thickness, :max_thickness, :active, :delivery_service_id belongs_to :delivery_service end 如您所见,送货服务有很多送货服务价格。 我正在尝试从送货服务价格表中检索记录; 选择外键唯一范围内具有最低价格属性的记录 ,delivery_service_id(基本上是每个交付服务的最便宜的交付服务价格)。 如何使用外键属性作为范围从表中选择唯一记录? 我希望我已经解释得足够了,如果您需要更多信息,请告诉我。 谢谢 更新#1: 我正在努力实现的例子: delivery_service_prices表: id:1,价格:2.20,delivery_service_id:1 id:2,价格:10.58,delivery_service_id:1 id:3,价格:4.88,delivery_service_id:2 id:4,价格:1.20,delivery_service_id:2 id:5,价格:14.99,delivery_service_id:3 […]

如何调整ActiveRecord(或直接SQL)查询以包含带有WHERE子句的JOIN上的零计数记录

我有一个关于在ActiveRecord中形成查询的问题,但也为那些不熟悉ActiveRecord的人提供了SQL。 我有以下模型类: class Shoe < ActiveRecord::Base has_many :purchases def self.available_shoes #show all shoes that have been purchased less than num_in_stock num_in_stock = 3 Shoe.includes(:purchases) .group("purchases.shoe_id") .having("COUNT(purchases.shoe_id) < ?", num_in_stock) end def self.available_shoes_for_user(user) #show all available_shoes that a user hasn't already purchased Shoe.available_shoes.where("purchases.user_id != ?", user.id) end end 方法Shoe.available_shoes按预期工作,因为它将返回购买的所有鞋子的次数少于库存中可用的数量(在这种情况下为3),包括已购买零次的鞋子。 当我打电话给Shoe.available_shoes_for_user(user)时会出现问题,它会显示所有已购买的鞋子,但它没有显示零购买的鞋子。 我已经解压缩了下面的原始SQL: #Shoe.available_shoes SELECT shoes.*, purchases.* FROM […]

如果存在基于记录id以外的属性的特定记录,如何创建新记录或更新,Ruby on Rails?

我有2个模型类,员工和公司。 外部库只生成员工ID。 如果他的详细信息已存在,我正在尝试更新员工详细信息,否则我需要创建新的员工详细信息。 以下是create方法的代码: def create if !@emp= Details.find_or_create_by_emp_id(params[:details][:emp_id]) @emp = Details.new(params[:details]) // some logic goes here else @emp.update_attributes(params[:details]) render action: “show” end end 但是这总是使用现有的emp_id创建一个新记录,而不是更新与特定emp_id相关的表行。 如何使其工作?

Rails,解决这个n + 1的技巧?

我有一个员工视图,其中列出了所有技能,这些技能都写在我的数据库的技能表中。 对于每个员工,所有技能都会显示出来,就像希望的那样。 员工和技能彼此相关,就像许多人一样:通过联想。 class Employee < ApplicationRecord has_many :employeeskillsets, foreign_key: "employee_id" has_many :skills, through: :employeeskillsets end class Skill < ApplicationRecord has_many :employeeskillsets, foreign_key: "skill_id" has_many :employees, through: :employeeskillsets end class Employeeskillset < ApplicationRecord belongs_to :employee, foreign_key: 'employee_id' belongs_to :skill, foreign_key: 'skill_id' end 所有这些技能都显示为按钮,这些按钮用于启用/禁用该员工的特定技能(每次单击直接插入/删除,无需额外提交)。 但现在,我想在加载页面时将按钮显示为彩色。 如果已启用该技能,则按钮颜色应为绿色,否则为灰色。 这里开始我的问题:我的应用程序使用一个单独的select语句检查每个技能。 我使用以下代码: 我已经尝试过使用包含,但似乎存在? 独立检查每项技能。 这里有人有一个建议,我怎么能用一个选择来解决这个问题? 在此先感谢,我希望我已经提到了一切,必要的。 编辑1:我忘了提到,我通过部分渲染(如果知道这很重要)。 这是当前在employees_controller中使用的@employee var。 @employee […]